繁体   English   中英

自定义jaxb绑定为primtive

[英]Customizing jaxb bindings for primtive

我有几个模式我正在生成jaxb绑定,因为它可以自由使用xs:integer 我希望将这些值绑定到long / Long而不是默认的BigInteger。 不幸的是,我没有能力修改模式。 在我的绑定文件中添加一个简单的声明会导致xs:integer在所有情况下绑定到Long ,即使它是必需值:

<jaxb:javaType xmlType="xs:integer" name="long" />

当需要字段时,如何将xs:integer绑定到基元?

这很简单你只需要在.jxb文件中有两个不同的绑定,并使用正确的XPath选择器来查找需要映射到Integer的元素和另一个将找到要映射到int元素的XPath选择器。

由于您尚未发布.xsd.xjb文件,因此我将在一个小例子上展示一切是如何工作的。 假设我们有以下.xsd文件

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="user">
         <xs:complexType>
             <xs:sequence>
                 <xs:element type="xs:integer" name="age" minOccurs="1"/>
                 <xs:element type="xs:integer" name="balance" minOccurs="0"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>
</xs:schema>

所以从.xsd我们可以看到我们有一个user对象的定义,它具有所需的age属性(我们仍然可以使用use =“optional”属性,但这无关紧要)和balance属性是可选的。

因此,假设我们希望将age映射到Java int ,将balance映射到Integer

所以我们只需要一个绑定文件,它将找到所有type属性等于xs:integer的节点xs:integerminOccurs属性等于1并应用一些自定义映射规则,并对minOccurs属性等于0的所有节点执行相同操作。

<jxb:bindings version="2.0" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <jxb:bindings schemaLocation="schema.xsd">
        <!---Find all optional integers and map them to java.lang.Integer -->
        <jxb:bindings node="//xs:element[@minOccurs='0' and @type='xs:integer']" multiple="true">
            <xjc:javaType name="java.lang.Integer" adapter="adapters.IntegerAdapter" />
        </jxb:bindings>

        <!---Find all required integers and map them to primitive int -->
        <jxb:bindings node="//xs:element[@minOccurs='1' and @type='xs:integer']" multiple="true">
            <xjc:javaType name="int" adapter="adapters.IntAdapter" />
        </jxb:bindings>

    </jxb:bindings>
</jxb:bindings>

这是在运行构建之后(记得启用供应商自定义添加-extension命令行参数),你会有这样的东西。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"age",
"balance"
})
@XmlRootElement(name = "user")
public class User {

    @XmlElement(required = true, type = String.class)
    @XmlJavaTypeAdapter(IntAdapter.class)
    @XmlSchemaType(name = "integer")
    protected int age;
    @XmlElement(type = String.class)
    @XmlJavaTypeAdapter(IntegerAdapter.class)
    @XmlSchemaType(name = "integer")
    protected Integer balance;

    // getters setters will be here
}

另外,请注意我没有添加adapters.IntegerAdapter的源adapters.IntegerAdapteradapters.IntAdapter这部分适合你)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM