2011-11-01 2 views
7

Disons que nous avons l'énumération Java 1.5 suivante:ENUM Marshalling attributs en XML en utilisant JAXB et JAXWS Annotations

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; 
    } 
} 

J'utilise Apache CXF et le WSDL généré, comme prévu, se traduit par l'ENUM mentionné ci-dessus dans une restriction :

<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> 

Jusqu'ici tout va bien et c'est une caractéristique souhaitable. Je me souviens d'avoir lutté avec de telles structures avant Apache CXF (quand j'ai utilisé XFire).

Cependant, ce n'est pas le cas ici. Je veux produire un résultat différent. Je veux que l'énumération soit traduite en un type complexe et que le code et le message des attributs soient traduits en éléments XML lorsqu'un objet contenant une instance de cette énumération est appelé. Je veux seulement qu'il ne se comporte pas comme une énumération. Je sais que je pourrais accomplir cela si j'utilisais une classe ordinaire plutôt qu'une énumération. Cependant, j'aimerais beaucoup le garder enum, donc je l'ai gardé dans la partie java du code.

Si le WSDL généré pouvait encore avoir une restriction quant aux valeurs possibles, ce serait le scénario parfait. Je pourrais faire sans, cependant. La chose principale ici serait de garder un Java 1.5 enum tout en rassemblant (et en générant un WSDL) ReturnCode comme un type complexe avec le code et le message comme éléments.

J'ai essayé de faire allusion à cela avec les annotations JAXWS données dans le code source enum. Est-il possible d'accomplir cela avec seulement ces annotations (ou d'autres)? Ou devrais-je écrire un marshaller/unmarshaller personnalisé et un générateur WSDL?

Merci beaucoup!

Meilleures salutations,

Filipe Fedalto

+1

Je viens de tombé par hasard sur une autre question similaire. Je ne l'ai pas trouvé dans mes résultats de recherche parce que les libellés sont très différents. Ce n'est pas exactement ce que je cherche, mais cela peut certainement amener les choses à mi-chemin. Quoi qu'il en soit, cela implique l'utilisation de @XmlJavaTypeAdapter. Vous pouvez le trouver dans [Custom Sérialisation de la valeur pour Enums] (http://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) –

Répondre

0

Utilisez énumérations dans votre code serveur java et se traduisent par type complexe dans l'interface vous service.

Exemple:

@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 
} 
Questions connexes