我通过maven pom中的wsdl2java目标生成我的代理类。
示例xsd:
<xs:complexType name="address">
<xs:sequence>
<xs:element name="street" type="xs:string" />
<xs:element name="homeNo" type="xs:int" />
</xs:sequence>
</xs:complexType>
生成的类具有带有int(基本类型)的homeNo属性。我想“大整数”包装类型。怎么逼呢?一种方法是添加nillable =“true”,但它很糟糕,在架构中看起来不太好。
答案 0 :(得分:2)
nilable=true
或minOccurs="0"
是要走的路,请参阅XJC Generating Integer Instead of int
由于以下原因,我更喜欢此解决方案与globalBindings
相比:
globalBindings
是一个全局开关,对所有映射都有影响。在某些情况下,这可能更为可取,但在使用Integers时很少会这样。nilable=true
或minOccurs="0"
正在为映射添加语义。它说这些值是可以为空的。如果缺少这些属性,则必须假设情况并非如此。也就是说,如果值 可以为空,则只应使用Integer
而不是int
。 Integer
Java值映射到XML等价物,则使用int
而不是null
是灾难性的:如果在Java中,值的结果应该是XML中的结果null
但是在XSD中没有标记相应的属性?这可能会生成无效的XML数据。答案 1 :(得分:2)
您可以使用绑定文件自定义Java类型的转换。例如,如果要将所有xsd:int元素绑定到BigInteger,请使用内容创建文件bindings.xjb
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings>
<!-- use BigInteger instead of int-->
<jxb:javaType name="java.math.BigInteger" xmlType="xs:int"/>
</jxb:globalBindings>
</jxb:bindings>
调用wsdl2java时,使用-b
选项指定绑定文件
wsdl2java -b bindings.xjb foo.wsdl
这将导致XJC生成适配器类,可能命名为
org.w3._2001.xmlschema.Adapter1
您生成的对象将使用此类与@XmlJavaTypeAdapter anotation。
您还可以使用parseMethod
的{{1}}和printMethod
属性提供自己的适配器方法。
Java Web服务教程的Customizing JAXB Bindings部分提供了有关使用<jxb:javaType />
可以执行的操作的更多详细信息。