這很簡單,只需要在.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
屬性=「可選」的屬性的定義,以及,但沒關係)和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
這部分是給你的)