我有几个模式我正在生成jaxb绑定,因此可以自由使用xs:integer
。我希望将这些值绑定到long
/ Long
而不是默认的BigInteger。不幸的是,我没有能力修改模式。在我的绑定文件中添加一个简单的声明会导致xs:integer
在所有情况下绑定到Long
,即使它是必需的值:
<jaxb:javaType xmlType="xs:integer" name="long" />
如果需要字段,如何将xs:integer
绑定到基元?
答案 0 :(得分:0)
非常简单,你只需要在.jxb
文件中有两个不同的绑定,并使用正确的XPath选择器来查找需要映射到Integer
的元素和另一个XPath选择器它将找到将要映射到int
的元素。
由于您尚未发布.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 =&#34; optional&# 34;属性,但无关紧要)和balance
属性是可选的。
因此,我们希望将age
映射到Java int
,将balance
映射到Integer
。
所以我们只需要一个绑定文件,它会找到type
属性等于xs:integer
且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
}
另请注意,我没有添加adapters.IntegerAdapter
和adapters.IntAdapter
的来源,此部分适合您)