Apache CXF我不想要原语

时间:2014-03-07 09:56:40

标签: java maven wsdl cxf wsdl2java

我通过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”,但它很糟糕,在架构中看起来不太好。

2 个答案:

答案 0 :(得分:2)

nilable=trueminOccurs="0"是要走的路,请参阅XJC Generating Integer Instead of int

由于以下原因,我更喜欢此解决方案与globalBindings相比:

  1. globalBindings是一个全局开关,对所有映射都有影响。在某些情况下,这可能更为可取,但在使用Integers时很少会这样。
  2. nilable=trueminOccurs="0"正在为映射添加语义。它说这些值是可以为空的。如果缺少这些属性,则必须假设情况并非如此。也就是说,如果值 可以为空,则只应使用Integer而不是int
  3. 如果要将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 />可以执行的操作的更多详细信息。