JAXB在xs:integer上进行javaType定制将生成带有"type=String.class"的@XmlElement。

7
当使用XJC从XSD生成Java bean时,我需要将xs:integer映射到Integer而不是BigInteger。我在我的JAXB定制文件中添加了一个javaType标签(如本网站上的许多答案所述),它运行良好。
但是在生成的代码中,我注意到@XmlElement标记现在具有type=String.class参数
那么现在我想知道,为什么是String
是因为解析和打印方法正在转换为/来自字符串对象吗?
我尝试使用xjc:javaType代替jaxb:javaType,允许我用自定义的MyAdapter<BigInteger,Integer>替换生成的Adapter1<String,Integer>,但是完全相同的事情发生了。
如果这是正常的XJC行为,是否可能调整它以生成没有此参数或具有另一个值而不是String的代码?
请注意,一切都正常工作,但我想要理解。
另外,我正在使用Enunciate记录我的API,它似乎对此type事物感到困惑(但这可能是Enunciate中的错误)。
我正在使用JAXB RI 2.2.6,这里是一些代码片段,以说明我的问题:

bindings.xjb

<jaxb:bindings version="2.0" ...>
    <jaxb:globalBindings>
        <jaxb:javaType
                name="java.lang.Integer"
                xmlType="xs:integer"
                parseMethod="..."
                printMethod="..." />
        </jaxb:globalBindings>
</jaxb:bindings>

XSD 中的字段定义

<xs:complexType name="MyType">
    <xs:sequence>
        <xs:element name="myField" type="xs:integer" />
    </xs:sequence>
</xs:complexType>

生成的Java字段

@XmlElement(namespace = "...", required = true, type = String.class)
@XmlJavaTypeAdapter(Adapter1.class)
@XmlSchemaType(name = "integer")
protected Integer myField;
1个回答

7

我知道这是一个老问题,但对于仍在寻找答案的人: 使用类型xs:int而不是xs:integer将创建一个普通的Java int,而不是Biginteger


int 的问题在于它不支持 null 值,而 Integer 支持。 - Leonard Brünings
都是正确的,但我的问题不是关于目标Java类型,而是关于生成的@XmlElement注释。 此外,如果我可以更改XSD以使用xs:int(我不能,这就是为什么我正在使用适配器),我怀疑JAXB将根据字段的可空性生成一个int Integer - Thomas Gillet
2
指定 type="int" 将得到一个 int,指定 minOccurs=0type="int" 将得到一个 Integer - Eric Duminil
@EricDuminil 我发现我必须使用 nillable =“true” 而不是 minOccurs = 0 - Shane Rowatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接