2011-11-01 17 views
7

Diciamo che abbiamo il seguente Java 1.5 enumerazione:enum Marshalling in XML utilizzando JAXB e jaxws annotazioni

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
public enum ReturnCode { 
    OK(0,"Ok"), 
    ERROR_VALIDATION(1,"Validation Error"), 
    ERROR_TRANSPORT(2, "Transport Error"), 
    ERROR_CASE_01(101, "Business situation #01"), 
    ERROR_CASE_02(102, "Business situation #02"), 
    ERROR_CASE_03(103, "Business situation #03"); 

    @XmlElement(nillable=false, required=true) 
    private Integer code = 0; 

    @XmlElement(nillable=false, required=true) 
    private String message = null; 

    private ReturnCode(Integer code, String message) { 
     this.code = code; 
     this.message = message; 
    } 

    public Integer getCode() { 
     return code; 
    } 

    public String getMessage() { 
     return message; 
    } 
} 

Sto usando Apache CXF ed il WSDL generato, come previsto, traduce l'enumerazione di cui sopra in una restrizione :

<xsd:simpleType name="ReturnCode"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="OK"/> 
     <xsd:enumeration value="ERROR_VALIDATION"/> 
     <xsd:enumeration value="ERROR_TRANSPORT"/> 
     <xsd:enumeration value="ERROR_CASE_01"/> 
     <xsd:enumeration value="ERROR_CASE_02"/> 
     <xsd:enumeration value="ERROR_CASE_03"/> 
    </xsd:restriction> 
</xsd:simpleType> 

Fin qui tutto bene ed è una funzionalità desiderabile. Io stesso ricordo di essere alle prese con tali strutture prima di Apache CXF (quando ho usato XFire).

Tuttavia, questo non è il caso qui. Voglio produrre un risultato diverso. Voglio che l'enum sia tradotto in un Tipo complesso e che sia gli attributi che il codice e il messaggio siano tradotti in elementi XML quando un oggetto contenente un'istanza di questa enumerazione viene eseguito il marshalling. Voglio solo che non si comporti come un enum. So che potrei realizzarlo se usassi una classe semplice invece di un enum. Tuttavia, mi piacerebbe molto tenerlo enum, quindi l'ho tenuto sicuro al sicuro nella parte java del codice.

Se il WSDL generato potrebbe ancora avere una restrizione sui possibili valori, sarebbe lo scenario perfetto. Potrei farne a meno, comunque. La cosa principale qui sarebbe di mantenerlo un enum di Java 1.5 mentre ancora il marshalling (e la generazione di un WSDL) ReturnCode come un tipo complesso con codice e messaggio come suoi elementi.

Ho cercato di suggerire che con le date annotazioni JAXWS inserite nel codice sorgente enum. È in qualche modo possibile farlo solo con queste (o altre) annotazioni? O dovrei scrivere un custom marshaller/unmarshaller e un generatore WSDL?

Grazie mille!

Con i migliori saluti,

Filipe Fedalto

+1

Ho appena accidentalmente inciampato su un'altra domanda simile. Non l'ho trovato nei miei risultati di ricerca perché le diciture sono molto diverse. Questo non è esattamente quello che sto cercando, ma certamente può portare le cose a metà strada. Ad ogni modo, implica l'uso di @XmlJavaTypeAdapter. Puoi trovarlo in [Serializzazione valore personalizzato per enumerazioni] (http://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) –

risposta

0

Utilizzare enums nel codice del server Java e si traducono in tipo complesso nell'interfaccia di un servizio.

Esempio:

@WebMethod 
public ComplexType GetInfo(){ 
    ReturnCode response; 
    response = ReturnCode.OK; 
    ComplexType wsResponse; 
    wsResponse = response.toComplexType() 
    return wsResponse; 
} 

@WebMethod 
public void PutInfo(ComplexType input){ 
    ReturnCode request = ReturnCode.fromComplexType(input); 
    //more code 
} 
Problemi correlati