【问题标题】:Jaxb: Two declarations in a wsdl cause a collision in the objectFactory classJaxb:wsdl 中的两个声明导致 objectFactory 类中的冲突
【发布时间】:2017-12-23 12:09:25
【问题描述】:

我想使用 Affilinet API。它的一个 WSDL 文件在这里:

Affilinet AccountService.wsdl

我使用这个 Maven 插件来生成源代码:

Jaxb Maven Plugin

我的 Pom.xml 插件配置:

<plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.13.1</version>
                <executions>
                    <execution>
                        <id>schema1-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <schemaLanguage>WSDL</schemaLanguage>
                            <generatePackage>webservices.framework.affilinet.logon</generatePackage>
                            <schemas>
                                <schema>
                                    <url>https://api.affili.net/V2.0/Logon.svc?wsdl</url>
                                </schema>
                            </schemas>
                        </configuration>
                    </execution>
                    <execution>
                    <id>schema2-generate</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <schemaLanguage>WSDL</schemaLanguage>
                        <generatePackage>webservices.framework.affilinet.inbox</generatePackage>
                        <schemas>
                            <schema>
                                <url>https://api.affili.net/V2.0/PublisherInbox.svc?wsdl</url>
                            </schema>
                        </schemas>
                    </configuration>
                </execution>
                    <execution>
                        <id>schema3-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <schemaLanguage>WSDL</schemaLanguage>
                            <generatePackage>webservices.framework.affilinet.inbox</generatePackage>
                            <schemas>
                                <schema>
                                    <url>https://api.affili.net/V2.0/AccountService.svc?wsdl</url>
                                </schema>
                            </schemas>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

所以,在编译这个时,我得到一个错误:

com.sun.istack.SAXParseException2; systemId: https://api.affili.net/V2.0/AccountService.svc?wsdl; lineNumber: 1; columnNumber: 2127; Two declarations cause a collision in the objectFactory class.

但是如何使用来自 url 的 wsdl 文件来解决这个问题?

schemaLocation 不接受 wsdl 文件....

编辑:完整日志:

[ERROR] Error while generating code.Location [ https://api.affili.net/V2.0/AccountService.svc?wsdl{1,6200}].

com.sun.istack.SAXParseException2;系统ID:https://api.affili.net/V2.0/AccountService.svc?wsdl;行号:1;列号:6200;这是另一个声明。

【问题讨论】:

  • 一个选项中是否定义了两个同名元素?我通过重命名其中一个定义的绑定修复了这个问题,因此名称是唯一的。
  • 是的,你能告诉我你是怎么做到的吗?我用完整的日志编辑我的问题
  • 对不起,我在手机上,无法正确查找。一般的想法是为其中一个元素(由 xpath 定义)添加一个绑定,并为其分配一个将在 Jaxb 模型中使用的不同名称。

标签: java affiliate maven-jaxb2-plugin


【解决方案1】:

如果您有两个相互冲突的定义,通常会发生这种情况。很难判断您的 WSDL 究竟出了什么问题,因为它的格式很差。但通常这将类似于两个元素在转换为 Java 后获得相同的方法名称。

您通常可以通过绑定自定义来解决此问题。这是一个例子:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:extensionBindingPrefixes="xjc">

    <jaxb:bindings 
        schemaLocation="http://schemas.opengis.net/citygml/texturedsurface/1.0/texturedSurface.xsd" 
        node="/xs:schema">
        <jaxb:bindings node="xs:element[@name='_Appearance']">
            <jaxb:factoryMethod name="AAppearance"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

因此,您要做的就是找出导致问题的确切原因,编写并应用绑定。我要做的第一件事是下载 WSDL,将其格式化为人类可读的并在本地编译。这应该可以明确指出哪些部分会导致问题。

【讨论】:

  • 我复制了您作为示例提供的部分,但 IntelliJ 告诉我这里不允许使用“jaxb:factoryMethod”和“jaxb:extensionBindingPrefixes”。为什么会这样?
  • 这是一个example from a working project,所以在这种情况下我会忽略 IntelliJ 警告。可能它使用了一些过时的 XSD 来验证 XJB 文件。
【解决方案2】:

面对同样的问题,我有多个架构,很难确定哪些元素会导致冲突。在添加 jaxb 绑定以为重复的元素提供不同名称后,我能够解析并生成 ObjectFactory 类。

示例:我将“Id”作为 Product.xsdCustomerOrder.xsd 中的公共元素之一,因此必须在 common.xjb 文件中提供绑定。

    <jaxb:bindings schemaLocation="../../Common/XSD/Product.xsd" node="//xs:element[@name='Id']">
        <jaxb:class name="ProductId" />
    </jaxb:bindings>

     <jaxb:bindings schemaLocation="../../Common/XSD/CustomerOrder.xsd" node="//xs:element[@name='Id']">
         <jaxb:class name="CustomerOrderId" />
     </jaxb:bindings>

这就是我在pm.xml中定义的execution

                  <execution>
                        <id>Outbound</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <args>
                                <arg>-XautoNameResolution</arg>
                                <arg>-XtoString</arg>
                            </args>
                            <schemaLanguage>WSDL</schemaLanguage>
                            <generatePackage>some.package.name</generatePackage>
                            <generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
                            <schemaDirectory>${project.basedir}/src/main/resources/Outbound/WSDL</schemaDirectory>
                            <bindingDirectory>${project.basedir}/src/main/resources/Outbound/WSDL</bindingDirectory>
                            <strict>false</strict>
                            <bindingIncludes>
                                <include>*.xjb</include>
                            </bindingIncludes>
                            <schemaIncludes>
                                <include>*.wsdl</include>
                            </schemaIncludes>
                            <plugins>
                                <plugin>
                                    <groupId>org.jvnet.jaxb2_commons</groupId>
                                    <artifactId>jaxb2-basics</artifactId>
                                    <version>${jaxb2.basics.version}</version>
                                </plugin>
                            </plugins>
                        </configuration>
                    </execution>

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2016-01-06
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2012-08-06
    • 2013-04-04
    相关资源
    最近更新 更多