首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为primtive定制jaxb绑定

为primtive定制jaxb绑定
EN

Stack Overflow用户
提问于 2017-08-08 08:58:03
回答 1查看 1.1K关注 0票数 4

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

代码语言:javascript
代码运行次数:0
运行
复制
<jaxb:javaType xmlType="xs:integer" name="long" />

当字段是必填字段时,如何将xs:integer绑定到原语?

EN

回答 1

Stack Overflow用户

发布于 2017-08-11 20:28:39

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

由于您还没有发布您的.xsd.xjb文件,因此我将仅通过一个小示例来说明它是如何工作的。让我们假设我们有以下.xsd文件

代码语言:javascript
代码运行次数:0
运行
复制
<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:integerminOccurs属性等于1的所有节点,并应用一些自定义映射规则,对所有minOccurs属性等于0的节点执行相同的操作。

代码语言:javascript
代码运行次数: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命令行参数来启用供应商定制),您将得到如下所示的内容。

代码语言:javascript
代码运行次数:0
运行
复制
@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.IntegerAdapteradapters.IntAdapter的源代码这部分是为您准备的)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45557708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档