java – 为primtive定制jaxb绑定
发布时间:2020-12-15 02:19:57 所属栏目:Java 来源:网络整理
导读:我有几个模式我正在生成jaxb绑定,因为它可以自由使用xs:integer.我希望将这些值绑定到long / Long而不是默认的BigInteger.不幸的是,我没有能力修改模式.在我的绑定文件中添加一个简单的声明会导致xs:integer在所有情况下绑定到Long,即使它是必需值: jaxb:
我有几个模式我正在生成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我们可以看到我们有一个用户对象的定义,它具有所需的age属性(我们仍然可以使用use =“optional”属性,但这无关紧要)和balance属性是可选的. 因此,假设我们希望将年龄映射到Java int,将余额映射到Integer. 所以我们只需要一个绑定文件,它将找到所有类型属性等于xs的节点:整数和minOccurs属性等于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 } 另外,请注意我没有添加适配器的源.IntegerAdapter和adapters.IntAdapter这部分适合你) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |