如何更新生成的存根的XML-TYPE

时间:2017-07-12 11:23:51

标签: java maven wsdl maven-jaxb2-plugin

我使用maven-jaxb2-plugin从多个wsdl端点成功生成java类。

这是一次执行:

                <execution>
                    <id>generateDelta</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <schemaLanguage>WSDL</schemaLanguage>
                        <generatePackage>com.somepackage1</generatePackage>
                        <schemas>
                            <schema>
                                <url>
                                    wsdl_url
                                </url>
                            </schema>
                        </schemas>
                    </configuration>
                </execution>

这里的问题是我有多个执行,因此生成多个类,每个执行都将类保存在不同的包中。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Bapiret2", propOrder = {...})

Babiret2.java类中的一个是在多个包中生成的(因此,它来自多个wdsls)

当我执行使用此存根的代码时,例如在单元测试中,我得到以下异常:

    org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{urn:sap-com:document:sap:soap:functions:mc-style}Bapiret2". Use @XmlType.name and @XmlType.namespace to assign different names to them.
    this problem is related to the following location:
        at com.somepackage1.Bapiret2
    this problem is related to the following location:
        at com.somepackage2.Bapiret2

我发现了一些可能的修复,比如在args标签下添加配置

-XautoNameResolution

arg,它没有用

我测试过更改XmlType名称属性是否有效。另外,为XmlType添加名称空间也可以。

问题是我不知道如何在生成类

时使用maven添加它

2 个答案:

答案 0 :(得分:1)

对于每个wsdl url,在配置元素中,您应该同时指定schemaDirectory和generatePackage元素,这些元素应指向与其他元素不同的名称,因为schemaDirectory具有清除指定目录的副作用。

答案 1 :(得分:1)

当来自不同包但具有相同NameSpace的类都知道时,您的问题属于JAXBContext。 因此,您需要考虑多种因素:

  1. JAXBContext创作在你手中吗?如果是这样 - 你真的需要在同一个JAXBContext中的两个类吗?也许你可以为每个用例使用两种不同的上下文?我的意思是从var query = Context.Table.FirstorDefault(t => t.Name == name && and t.Country ==country && !AgeList.Contains(t.Age)) Bapiret2使用somepackage1时。
  2. 如果不可能:

    1. 这两个类somepackage2是否来自同一个XSD架构 和实际结构是一样的吗?

      如果是 - 您可能需要重新考虑生成的包结构。

      您只能为所有wsdl生成一个Bapiret2类。有 通常通过向基础XJC编译器添加额外的映射参数(如

      )来实现此目的的方法数量
      Bapiret2
    2. 请检查插件文档如何执行此操作... (注意:有一个副作用:在包中只有上一个插件执行的类。

      1. 如果不同XSD中的 -p {namespace}={package Name} XML元素具有相同的命名空间,但结构不同(......不幸的是,当webservice开发人员违反命名空间的主要目的时,这是很常见的情况......) 那是最糟糕的情况。
      2. 在这种情况下,我使用上面的第一个解决方案 - 不同的JAXBContexts

        但无论如何,下面有一些解决方案。 (我从未尝试过,但似乎人们对此表示满意: - )

        getting-the-jaxb-exception-like-two-classes-have-the-same-xml-type-name

        extending-jaxb-representing-annotations.html

        PS。生成后手动(或通过某些脚本)更改仍然是选项...