2017-08-08 115 views
4

我有幾個模式,我正在生成jaxb綁定,因爲這使得自由使用xs:integer。我希望將這些值綁定到long/Long而不是默認的BigInteger。不幸的是我沒有修改模式的能力。添加一個簡單的聲明,以我的綁定文件會導致xs:integer在所有情況下被綁定到Long,即使它是一個必需的值:需要現場時自定義jaxb綁定爲原生

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

我怎樣才能得到xs:integer綁定到一個原始的?

回答

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屬性=「可選」的屬性的定義,以及,但沒關係)和balance屬性是可選的。

因此可以說我們希望age映射到Java intbalanceInteger

所以我們只需要一個綁定文件,該文件會發現所有這些都type屬性等於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.IntegerAdapteradapters.IntAdapter這部分是給你的)