2011-09-01 7 views
7

Il seguente schema va generando due primitive int campi in una classe Value, ma genera invece una primitiva int per la elemento e java.lang.Integer per l'attributo .XJC Generazione intero Invece di 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> 

Ho guardato attraverso il JAXB documentation per tutto ciò che dice che gli attributi e gli elementi possono essere generati in modo diverso e hanno trovato nulla.

Qualcuno può spiegarlo? Esiste una soluzione per rendere l'attributo generato come primitivo int?

risposta

18

Non sono completamente sicuro che questa sia la risposta, ma ho avuto un'illuminazione durante il debug della mia app.

La molteplicità predefinito per un elemento in uno schema XML è 1..1 (required) dove come la molteplicità predefinito per un attributo è 0..1 (optional).

  1. Quindi, dal momento che l'elemento è richiesto e un primitivo in Java ha un valore di default (molto probabilmente 0), ha senso per generare un <xsd:element type="xsd:int" /> come un primitivo Java.

  2. Poiché l'attributo è opzionale c'è una possibilità che possa essere nillable che non sarebbe possibile utilizzando un primitivo. Lo java.lang.Integer è un Object e quindi può essere null, quindi ha senso generare <xsd:attribute type="xsd:int" /> come java.lang.Integer.

Se si commette un attributo essere richiesta (<xsd:attribute type="xsd:int" use="required" />), si genererà come un primitivo int. Non ho visto la documentazione di JAXB che lo dice esplicitamente, ma ciò non significa che non esista; forse mi sono appena perso.

+4

+1 - La tua epifania è corretta. –