注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

wsdl中含ref="s:schema"时处理  

2014-08-13 21:26:14|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      又是java生成.net webservice服务的客户端代码的问题,之前日志有写过:
http://ljhzzyx.blog.163.com/blog/static/383803122013317104518435/
错误如下
src-resolve.4.2 Error resolving component 's:schema'. It was detected that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema' ...
      导致错误的位置在
<wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
        ...
        <s:sequence>
             <s:element ref="s:schema" />
             <s:any />
        </s:sequence>
    </s:schema>
</wsdl:types>
按照之前日志所说的,删除<s:element ref="s:schema" />(s:schema是types内最外层的元素,ref指向它,实际上相当于<s:any />),再生成java客户端代码的解决方式是错误的,会报错。但是把<s:element ref="s:schema" />改成<s:any />,又会报any重复的错误。下面这种写法
<s:any minOccurs="2" maxOccurs="2"/>
就等于两个any,这种方式也会报any重复定义错误。
      netbeans生成java的webservice客户端代码功能比较强大,pom中的wsimport插件、保存wsdl文件等,都自动处理了。不过netbeans生成webservice客户端的功能有点不太符合习惯,不是在项目上右键新建,而是ide的工具栏,新建文件功能中,找到web服务--web服务客户端来生成。
      回到src-resolve.4.2 Error,另外有个解决方法,说的是在<s:element ref="s:schema" />之前加上<xsd:import namespace="http://xxxx"/>的代码,语焉不详,而且也没尝试成功。
      在这里,找到一种解决方法
http://stackoverflow.com/questions/13499860/jax-ws-error-on-wsdl-file-error-resolving-component-sschema
在以上<s:any minOccurs="2" maxOccurs="2"/>修改的基础上(所有的多个any都要这样处理,可能有的地方会大于3次),在项目src/jaxws目录添加文件xsd.xjb,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
          version="2.0">

  <globalBindings>
    <xjc:simple />
  </globalBindings>

  <bindings scd="~xsd:complexType">
    <class name="ComplexTypeType"/>
  </bindings>

  <bindings scd="~xsd:simpleType">
    <class name="SimpleTypeType"/>
  </bindings>

  <bindings scd="~xsd:group">
    <class name="GroupType"/>
  </bindings>

  <bindings scd="~xsd:attributeGroup">
    <class name="AttributeGroupType"/>
  </bindings>

  <bindings scd="~xsd:element">
    <class name="ElementType"/>
  </bindings>

  <bindings scd="~xsd:attribute">
    <class name="attributeType"/>
  </bindings>
</bindings>
pom.xml中的插件修改为
<plugin>
    <groupId>org.jvnet.jax-ws-commons</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-b</arg><arg>http://www.w3.org/2001/XMLSchema.xsd</arg>
                </args>
                <wsdlFiles>
                    <wsdlFile>testticket.tianker.com/WebService/TicketOrderTY.asmx.wsdl</wsdlFile>
                </wsdlFiles>
                <packageName>com.xxx.changlu</packageName>
                <wsdlLocation>http://testticket.tianker.com/WebService/TicketOrderTY.asmx?wsdl</wsdlLocation>
                <staleFile>${project.build.directory}/jaxws/stale/TicketOrderTY.asmx.stale</staleFile>
                <bindingFiles>
                    <bindinFile>xsd.xjb</bindinFile>
                </bindingFiles>
            </configuration>
            <id>wsimport-generate-TicketOrderTY.asmx</id>
            <phase>generate-sources</phase>
        </execution>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <wsdlFiles>
                    <wsdlFile>testticket.tianker.com/WebService/TicketOrderTY.asmx.wsdl</wsdlFile>
                </wsdlFiles>
                <packageName>com.xxx.changlu</packageName>
                <wsdlLocation>http://testticket.tianker.com/WebService/TicketOrderTY.asmx?wsdl</wsdlLocation>
                <staleFile>${project.build.directory}/jaxws/stale/TicketOrderTY.asmx_1.stale</staleFile>
            </configuration>
            <id>wsimport-generate-TicketOrderTY.asmx_1</id>
            <phase>generate-sources</phase>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>webservices-api</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>
    <configuration>
        <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
        <xnocompile>true</xnocompile>
        <verbose>true</verbose>
        <extension>true</extension>
        <catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
    </configuration>
</plugin>
使用maven命令
mvn -Dmaven.ext.class.path="D:\\DevPrograms\\NetBeans\\NetBeans 8.0\\java\\maven-nblib\\netbeans-eventspy.jar" -Dfile.encoding=UTF-8 -Dmaven.test.skip=true compile
就可以生成webservice客户端代码了。

这里还有另外一种解决方式
http://stackoverflow.com/questions/13610217/jaxb-compiling-issue-error-property-any-is-already-defined
binding.xml
<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
    <jxb:bindings schemaLocation="schema.xsd">
        <jxb:bindings   node="//xsd:complexType[@name='foo']/xsd:sequence/xsd:choice/xsd:any[@namespace='http://checklists.nist.gov/sccf/0.1']">
            <jxb:property name="any2" />
        </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>
XML Schema (schema.xsd)
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/schema" 
    xmlns="http://www.example.org/schema"
    elementFormDefault="qualified">

    <xsd:complexType name="foo">
        <xsd:sequence>
            <xsd:choice minOccurs="1" maxOccurs="1">
                <xsd:any namespace=""
                    minOccurs="1" maxOccurs="unbounded" />
                <xsd:any namespace="http://checklists.nist.gov/sccf/0.1"
                    processContents="skip" minOccurs="1" maxOccurs="unbounded" />
            </xsd:choice>
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>
XJC Call
xjc -b binding.xml schema.xsd
这种没有试过。
        
      但是wsdl那种描述any,实际上是没有描述准确,实际调用的时候要自己解析xml的dom结构。系统对接过程中,碰到一种让人很难受的.net生成的webservice服务端,在wsdl中只是定义了s:any,而在实际方法调用的时候,才描述返回结果的结构。在结果数据的上面,就是上面<s:element ref="s:schema" />对应的位置,描述返回结果的结构。还没研究能不能动态生成结构与之对应的java类。目前临时的解决方法,就是在测试的时候,把返回结果定义复制到wsdl文件中,这样就能自动生成客户端代码。在实际调用方法时,再手动解析转换一下。

      最后,上面代码生成的调用可以更简单一些:mvn generate-sources。
      
  评论这张
 
阅读(3718)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017