2011-09-01 63 views
7

以下模式应产生两个原始int字段在一个类Value,而是产生用于元件java.lang.Integer属性一个原始intXJC生成整数代替INT

<?xml version="1.0" encoding="UTF-8"?> 

<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/test" xmlns:test="http://www.example.com/test" 
    elementFormDefault="qualified"> 

    <xsd:element name="values"> 
     <xsd:complexType> 
      <xsd:sequence minOccurs="0" maxOccurs="unbounded"> 
       <xsd:element ref="test:value" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="value"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <!-- Is generated as primitive int --> 
       <xsd:element name="element" type="xsd:int" /> 
      </xsd:sequence> 
      <!-- Is generated as java.lang.Integer --> 
      <xsd:attribute name="attribute" type="xsd:int" /> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

我已经通过JAXB documentation寻找任何表示,属性和元素可以被不同地产生和一无所获。

任何人都可以解释这一点吗?是否有修复使属性生成为原始的int

回答

18

我不完全确定这是答案,但我在调试我的应用程序时有一个顿悟。

用于在XML模式的元件默认多样性是1..1 (required)其中作为用于属性默认多样性是0..1 (optional)

  1. 因此,由于元件需要和在Java中的原语具有默认值(最有可能的0),是有意义的产生<xsd:element type="xsd:int" />作为Java原语。

  2. 由于属性可选有一种可能性,即它可以是nillable使用原始这将是不可能的。 java.lang.IntegerObject,因此允许为null,因此生成<xsd:attribute type="xsd:int" />作为java.lang.Integer是有意义的。

如果做了属性需要<xsd:attribute type="xsd:int" use="required" />),它会产生一个原始int。我没有看到JAXB明确说明这一点的文档,但这并不意味着它不存在;也许我只是错过了它。

+4

+1 - 你的顿悟是正确的。 –