Java WSDL文件上的JAX-WS错误:";解析组件时出错';s:schema'&引用; 错误

Java WSDL文件上的JAX-WS错误:";解析组件时出错';s:schema'&引用; 错误,java,jaxb,wsdl,jax-ws,wsimport,Java,Jaxb,Wsdl,Jax Ws,Wsimport,我在一个Java项目中使用wsimport为三个SOAP web服务生成源代码。前两个很好:我使用JAX-WSMaven插件获取WSDL文件并生成相应的Java源文件 对于一个web服务,这将失败;我得到以下错误: [jaxws:wsimport] Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.

我在一个Java项目中使用wsimport为三个SOAP web服务生成源代码。前两个很好:我使用JAX-WSMaven插件获取WSDL文件并生成相应的Java源文件

对于一个web服务,这将失败;我得到以下错误:

[jaxws:wsimport]
Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
jaxws:wsimport args: [-s, /home/me/NetBeansProjects/Admin/AdminWeb/target/generated-sources/jaxws-wsimport, -d, /home/me/NetBeansProjects/Admin/AdminWeb/target/classes, -verbose, -catalog, /home/me/NetBeansProjects/Admin/AdminWeb/src/jax-ws-catalog.xml, -wsdllocation, http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx?WSDL, -target, 2.0, -extension, -Xnocompile, /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl]
parsing WSDL...


src-resolve.4.2: Error resolving component 's:schema'. It was detected that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema', but components from this namespace are not referenceable from schema document 'file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1'. If this is the incorrect namespace, perhaps the prefix of 's:schema' needs to be changed. If this is the correct namespace, then an appropriate 'import' tag should be added to 'file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1'.
  line 80 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1

undefined element declaration 's:schema'
  line 80 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl

undefined element declaration 's:schema'
  line 127 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl

undefined element declaration 's:schema'
  line 142 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl

罪魁祸首 此WSDL文件与正常工作的WSDL文件之间的区别在于错误消息第80、127和142行中指出的内容:

<s:element ref="s:schema" />

我试过的 我已经做了研究。看起来其他人也有类似的问题,从“只是不使用
”到“使用导入标签”,再到旧java.net论坛上的一些不可知的解决方案(在它被拆除之前,是对现代亚历山大java知识库的纵火)

  • 我尝试将以下导入语句放在包含问题标记的元素中:
    。wsimport给了我一个新错误:

    [jaxws:wsimport]
    Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    jaxws:wsimport args: [-s, /home/me/NetBeansProjects/Admin/AdminWeb/target/generated-sources/jaxws-wsimport, -d, /home/me/NetBeansProjects/Admin/AdminWeb/target/classes, -verbose, -catalog, /home/me/NetBeansProjects/Admin/AdminWeb/src/jax-ws-catalog.xml, -wsdllocation, http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx?WSDL, -target, 2.0, -extension, -Xnocompile, /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl]
    parsing WSDL...
    
    
    Element "{http://www.w3.org/2001/XMLSchema}annotation" shows up in more than one properties.
      line 248 of http://www.w3.org/2001/XMLSchema.xsd
    
    The following location is relevant to the above error
      line 242 of http://www.w3.org/2001/XMLSchema.xsd
    
    Property "Any" is already defined. Use &lt;jaxb:property> to resolve this conflict.
      line 108 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    
    The following location is relevant to the above error
      line 109 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    
    Property "Any" is already defined. Use &lt;jaxb:property> to resolve this conflict.
      line 184 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    
    The following location is relevant to the above error
      line 185 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    
    Property "Any" is already defined. Use &lt;jaxb:property> to resolve this conflict.
      line 199 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    
    The following location is relevant to the above error
      line 200 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
    
    此错误中引用的第108行和第109行是:(第184-5行、第199-200行类似)

    
    
  • 我已经尝试将jaxws maven插件从1.10升级到2.2。同样的问题

  • --我试图弄清楚如何使用JAX-WS Maven插件实现这一点。有什么提示吗

结论 有什么想法吗?你需要进一步的信息吗?为了简洁起见,我省略了pom.xml和Service.asmx.wsdl文件,但如果其中有更重要的信息,可以包含它们

谢谢大家!


附录 ,如果这有助于任何潜在的回答者。
我不太明白,但这似乎意味着我必须手动解析SOAP XML!恐怖

如果您实际上不关心模型数据的这一特定位,那么您可以使用JAXB绑定文件来告诉JAXB将有问题的位映射到类型为DOM
元素的属性,而不是实际尝试将它们绑定到普通的JAXB类中。本文有一节介绍了这种技术。

我通过适应Maven解决了这个问题,同时更新了jaxws Maven插件2.2。我将在这里向子孙后代重申:

总结 将(请参见下文)放在默认的绑定文件目录中,并将wsimport设置为绑定它和

XJB定制 前面提到的XML文件xsd.xjb的内容应该放在默认绑定文件目录中,如下所示(归功于Kohsuke):


聚甲醛 以下是我的POM文件的相关部分,注意到了更改:

<plugin>
    <!-- CHANGE: updated groupId and version -->
    <groupId>org.jvnet.jax-ws-commons</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution> 
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <!-- CHANGE: added args tag to bind http://www.w3.org/2001/XMLSchema.xsd -->
                <args>
                    <arg>-b</arg><arg>http://www.w3.org/2001/XMLSchema.xsd</arg>
                </args>
                <wsdlFiles>
                    <wsdlFile>erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl</wsdlFile>
                </wsdlFiles>
                <wsdlLocation>http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl</wsdlLocation>
                <staleFile>${project.build.directory}/jaxws/stale/Service.asmx.stale</staleFile>
                <!-- CHANGE: added bindingFiles tag to bind XJB customization, located at the default binding files directory, MyProject/src/jaxws/xsd.xjb . -->
                <bindingFiles>
                    <bindingFile>xsd.xjb</bindingFile>
                </bindingFiles>
            </configuration>
            <id>wsimport-generate-egtestreportengine</id>
            <phase>generate-sources</phase>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>webservices-api</artifactId>
            <version>1.4</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>
        <target>2.0</target>
    </configuration>
</plugin>

org.jvnet.jax-ws-commons
jaxws-maven插件
2.2
wsimport
-bhttp://www.w3.org/2001/XMLSchema.xsd
erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
${project.build.directory}/jaxws/stale/Service.asmx.stale
xsd.xjb
wsimport生成egtestreportengine
生成源
javax.xml
webservicesapi
1.4
${project.build.directory}/generated sources/jaxws-wsimport
真的
真的
真的
${basedir}/src/jax-ws-catalog.xml
2

对于Nick的解决方案,您可能需要将这两个jvm参数添加到pom.xml中 因此,当遇到这些错误时:

org.xml.sax.SAXParseException;系统ID:;行号:67;栏目号:11;外部DTD:读取外部DTD“XMLSchema.DTD”失败,因为由于accessExternalDTD属性设置的限制,不允许“http”访问

[警告]架构_引用:无法读取架构文档“xml.xsd”,因为由于accessExternalSchema属性设置的限制,不允许“http”访问。 第91行

只需将它们添加到pom.xml中即可

-Djavax.xml.accessExternalDTD=all
-Djavax.xml.accessExternalSchema=all

<vmArgs>
    <vmArg>-Djavax.xml.accessExternalDTD=all</vmArg>
    <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
-Djavax.xml.accessExternalDTD=all
-Djavax.xml.accessExternalSchema=all
-Djavax.xml.accessExternalDTD=all
-Djavax.xml.accessExternalSchema=all

使用以下命令修复了相同的问题:

wsimport-bhttp://www.w3.org/2001/XMLSchema.xsd  -b xsd.xjb service.wsdl

其中
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>

这似乎终于对我起作用了。我正在使用ApacheMaven cfx插件

    <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <additionalJvmArgs>
                                -Djavax.xml.accessExternalDTD=all
                            </additionalJvmArgs>
                            <sourceRoot>${basedir}/src/main/generated</sourceRoot> 
                            <wsdlOptions>
                                <wsdlOption>
                                    <extraargs>
                                        <extraarg>-autoNameResolution</extraarg>
                                        <extraarg>-impl</extraarg>
                                        <extraarg>-verbose</extraarg>
                                        <extraarg>-b</extraarg>
                                        <extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>

                                        <extraarg>-p</extraarg>
                                        <extraarg>com.nevado.travelstudio</extraarg>
                                    </extraargs>
                                    <!-- <bindingFiles> <bindingFile>${basedir}/src/main/resources/wsdl/mybindings.xjb</bindingFile> 
                                        </bindingFiles> -->
                                    <wsdl>${basedir}/src/main/resources/wsdl/B2.wsdl</wsdl>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

这可能是由于。。。有任何已知的解决方法吗?谢谢。我刚才在回答中详述的方法实际上可以归结为:;我对JAXB还不太了解,除非我弄错了,否则pom文件的
bindingFiles
部分和
wsimport
-b
命令行参数也会做同样的事情。为什么不把它们结合起来呢?作为参考,所提供链接上的
wsimport
命令是(有效地)
wsimport-bhttp://www.w3.org/2001/XMLSchema.xsd  -b xsd.xjb
另外,感谢您发布您的答案!它工作得很好!特别感谢您从bitrot手中拯救xjb。@jpaugh非常欢迎您!我非常高兴,三年半后,我帮助了某人:但对于生产系统来说,依赖外部资源通常是个坏主意。如果您需要重新构建并且无法获得外部资源,该怎么办?
-Djavax.xml.accessExternalDTD=all
-Djavax.xml.accessExternalSchema=all

<vmArgs>
    <vmArg>-Djavax.xml.accessExternalDTD=all</vmArg>
    <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
<?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>
    <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <additionalJvmArgs>
                                -Djavax.xml.accessExternalDTD=all
                            </additionalJvmArgs>
                            <sourceRoot>${basedir}/src/main/generated</sourceRoot> 
                            <wsdlOptions>
                                <wsdlOption>
                                    <extraargs>
                                        <extraarg>-autoNameResolution</extraarg>
                                        <extraarg>-impl</extraarg>
                                        <extraarg>-verbose</extraarg>
                                        <extraarg>-b</extraarg>
                                        <extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>

                                        <extraarg>-p</extraarg>
                                        <extraarg>com.nevado.travelstudio</extraarg>
                                    </extraargs>
                                    <!-- <bindingFiles> <bindingFile>${basedir}/src/main/resources/wsdl/mybindings.xjb</bindingFile> 
                                        </bindingFiles> -->
                                    <wsdl>${basedir}/src/main/resources/wsdl/B2.wsdl</wsdl>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  -Djavax.xml.accessExternalDTD=all