2014-10-24 12 views
7

Utilizzando JAXB/xjc fornito con JDK 1.7 (bin \ xjc.exe)JAXB/XJC genera JAXBElement <String> piuttosto che solo String (per gestire caso null)

ecco una snipped della mia XSD:

<xs:complexType name="NameType"> 
    <xs:sequence> 
     <xs:element name="Surname" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="Firstname" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="Middlename" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 

la classe generata spettacoli:

@XmlElementRef(name = "Surname", type = JAXBElement.class, required = false) 
protected JAXBElement<String> surname; 

public JAXBElement<String> getSurname() { 
    return surname; 
} 
public void setSurname(JAXBElement<String> value) { 
    this.surname = value; 
} 

capisco JAXB sta usando JAXBElement per permettere nulla, ma questo non ha senso dal momento che nulla dichiarato come stringa può essere impostato su null.

E non ho la possibilità di modificare l'XSD, perché il mio cliente preferisce lasciare in produzione l'XSD esistente.

Domanda: Posso cambiare il generatore di codice per generare:

@XmlElementRef(name = "Surname", type = String.class, required = false) 
protected String surname; 

public String getSurname() { 
    return surname; 
} 
public void setSurname(String value) { 
    this.surname = value; 
} 

Grazie Joel

risposta

3

verificare se è possibile passare gli argomenti al generatore di codice (xjc). Ho avuto lo stesso problema una volta ma ero in grado di risolvere il problema impostando generateElementProperty su false. Here's how i did it.

Questa è sicuramente una qualche opzione sul generatore di codice jaxb e dovrebbe essere in grado di spegnersi.

MODIFICA: In base a xjc.exe /? è possibile accelerare il file di bind con il parametro -b.

+0

Grazie per l'aiuto F1sh. Sembra funzionare. Risponderò se ci sono ulteriori problemi. – joellucuik

+1

Grazie mille per il tuo commento, mi ha davvero risolto il problema dopo diversi giorni di tentativi di trovare una soluzione! – Dmitriy

8

Per impostazione predefinita, un elemento JAXBElement viene generato quando un elemento XML è sia nillable che facoltativo.

<xs:element name="Surname" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/> 

Questo per consentire di costruire XML seguenti scenari:

  1. L'elemento dovrebbe essere assente dal documento XML quando la proprietà è null.
  2. L'elemento deve essere presente nell'XML con un valore di xsi:nil="true" quando la proprietà è un JAXBElement quando il flag nil è impostato.

per sbarazzarsi del JAXBElement è possibile utilizzare l'opzione generateElementProperty come answered by f1sh,, ma allora non sarà in grado di gestire entrambi gli scenari.

Per ulteriori informazioni

Vedere la mia risposta ad una domanda correlata:

+1

Grazie per l'aiuto Blaise. Tu rock signore. – joellucuik

+0

@joellucuik - Sempre buono per aiutare un collega alunni TOP. –

Problemi correlati