【问题标题】:JAXB javaType customization on xs:integer produces @XmlElement with "type=String.class"xs:integer 上的 JAXB javaType 自定义生成带有“type=String.class”的@XmlElement
【发布时间】:2013-04-29 13:45:34
【问题描述】:

当使用 XJC 从 XSD 生成 Java bean 时,我需要将 xs:integer 映射到 Integer 而不是 BigInteger。我在我的 JAXB 自定义文件中添加了一个 javaType 标记(如本网站的许多答案所述),它运行良好。

但在生成的代码中,我注意到@XmlElement 标签现在有一个type=String.class 参数

所以现在我想知道,为什么是String
是不是因为 parse 和 print 方法正在从字符串对象转换成字符串对象?

我尝试使用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;

【问题讨论】:

    标签: java jaxb2 xjc


    【解决方案1】:

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

    【讨论】:

    • int的问题是它不支持为null,Integer支持。
    • 都是真的,但我的问题不是关于目标 java 类型,而是关于生成的 @XmlElement 注释。另外,如果我可以将 XSD 更改为使用 xs:int(我不能,这就是我使用适配器的原因),我怀疑 JAXB 会生成一个 int OR 一个 Integer ,取决于字段的可空性。
    • 指定type="int" 产生int,指定minOccurs=0type="int"产生Integer
    • @EricDuminil 我发现我必须使用nillable="true" 而不是minOccurs=0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2017-05-05
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多