我使用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添加它答案 0 :(得分:1)
对于每个wsdl url,在配置元素中,您应该同时指定schemaDirectory和generatePackage元素,这些元素应指向与其他元素不同的名称,因为schemaDirectory具有清除指定目录的副作用。
答案 1 :(得分:1)
当来自不同包但具有相同NameSpace的类都知道时,您的问题属于JAXBContext。 因此,您需要考虑多种因素:
var query = Context.Table.FirstorDefault(t => t.Name == name && and t.Country ==country && !AgeList.Contains(t.Age))
和Bapiret2
使用somepackage1
时。 如果不可能:
这两个类somepackage2
是否来自同一个XSD架构
和实际结构是一样的吗?
如果是 - 您可能需要重新考虑生成的包结构。
您只能为所有wsdl生成一个Bapiret2
类。有
通常通过向基础XJC编译器添加额外的映射参数(如
Bapiret2
请检查插件文档如何执行此操作... (注意:有一个副作用:在包中只有上一个插件执行的类。
-p {namespace}={package Name}
XML元素具有相同的命名空间,但结构不同(......不幸的是,当webservice开发人员违反命名空间的主要目的时,这是很常见的情况......)
那是最糟糕的情况。在这种情况下,我使用上面的第一个解决方案 - 不同的JAXBContexts
但无论如何,下面有一些解决方案。 (我从未尝试过,但似乎人们对此表示满意: - )
getting-the-jaxb-exception-like-two-classes-have-the-same-xml-type-name
extending-jaxb-representing-annotations.html
PS。生成后手动(或通过某些脚本)更改仍然是选项...