我使用CXF从第三方wsdl生成java代码(不由我们维护)。
我有两个片段在编组到肥皂信息时没有按预期工作。
XML:
<choice>
<sequence>
<element name="x" type="xt" nillable="true" minOccurs="0" />
</sequence>
<element name="y" type="yt"
nillable="true" minOccurs="0" />
</choice>
Java:
@XmlElement(name = "x", nillable = true)
protected Xx;
@XmlElement(name = "y", nillable = true)
protected Y y;
如果我在soap消息中添加x而不是y(通过代码),那么它看起来像是:
<x>123456782</x>
<y xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
为什么在soap消息中添加y,而它是可选元素?
这个片段发生了类似的事情:
XML:
<attribute ref="z" use="required" fixed="XXX" />
Java:
@XmlAttribute(name = "z", namespace = "http://www.egem.nl/StUF/StUF0301",
required = true)
protected String z;
如果我不通过代码添加元素,那么cxf(模式验证为true)会抱怨。 如果我转向架构验证,则不会创建元素add all。
这个元素是必需的,并且有一个固定的属性,如果我不添加它(通过代码),为什么不创建它?
修改 在开发过程中,我意识到cxf正在生成一个.package-info.java文件,这给我带来了名称空间的麻烦。所以我正在寻找一种禁用生成.package-info.java文件的方法。解决方案是将一个extraarg放到px文件中的cxf codegen插件:-xjc-npa中。 pom中的那部分看起来像:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<configuration>
<defaultOptions>
<extraargs>
<extraarg>-xjc-npa</extraarg>
</extraargs>
</defaultOptions>
</configuration>
</plugin>
但是在重新生成类文件之后,令我惊讶的是,所有固定元素现在都是常量。不再生成getter / setter。但不幸的是,选择的问题仍然存在。
答案 0 :(得分:0)
显然我正在阅读旧文档。我所要做的就是将以下属性添加到绑定文件中的jaxb:globalBindings。
在旧文档中没有提到这些属性。
<jaxb:globalBindings fixedAttributeAsConstantProperty="true" choiceContentProperty="true">
使用这些属性,xml中的所有固定属性现在都是枚举,现在可以在代码中更好地生成xml中的所有选择元素(xxxOrxxxOrxxx格式)。