2010-12-02 11 views
7

Diese Frage wurde in verschiedenen Formen gestellt - aber ich denke, dass es noch Raum gibt, dies weiter zu katalogisieren.Jaxb generierte Klasse verwendet JAXBElement anstelle des angegebenen Typs

Ich habe eine XSD mit zwei Elementdefinitionen

<xs:complexType name="elementA"> 
    <xs:sequence> 
     <xs:element name="date" type="xs:string" minOccurs="0"/> 
     <xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

Dies erzeugt:

protected String date; 
@XmlElementRef(name = "lastXdigits", namespace = "http://xxxxxxx", type = JAXBElement.class) 
protected JAXBElement<String> lastXDigits; 

Ändern der XSD:

<xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="1"/> 

ergibt:

protected String date; 
@XmlElement(name = "lastXdigits", required = true, nillable = true) 
protected String lastXDigits; 

und mit:

<xs:element name="lastXdigits" type="xs:string" minOccurs="0"/> 

Ergebnisse in:

protected String date; 
@XmlElement(name = "lastXdigits") 
protected String lastXDigits; 

Das scheint mir sehr merkwürdig. Warum wird lastXDigits im ersten Fall als JAXBElement-Typ generiert und warum reicht ein String-Typ nicht in allen Fällen aus? Warum sollte Jaxb diese beiden Elemente auch anders behandeln, wenn ihre Definition neben dem Namen identisch ist?

Ich benutze eine jaxb-xjc ant Aufgabe von jaxb 2.0.5.

Sieht dies verdächtig aus oder gibt es eine gute Begründung für diese Unterschiede?

Antwort

6

Wenn nillable="true" zusammen mit minOccurs="0" ist es unmöglich, die Werte mit nur einem String darzustellen. Was würde null bedeuten? Bedeutet es, dass es null war oder dass es 0 Mal aufgetreten ist? Aber ich denke, das ist etwas unklar, wenn es nur um einen String geht.

Mit leerer Liste vergleichen. Eine Null-Liste unterscheidet sich sicherlich von einer leeren Liste.

+1

Ich denke, das ist relevant, wenn Sie an der Unterscheidung zwischen keinem Element und dem Wert des Elements interessiert sind, aber ich denke, in den meisten Fällen kümmert sich niemand wirklich darum und die zusätzliche Ebene der Umleitung ist nur ein Ärgernis . – Ellis

+1

Ja, aber ich denke, dass es in einigen Fällen eine gültige Unterscheidung sein kann. –

Verwandte Themen