2011-11-01 18 views
7

मान लीजिए कि हम निम्न जावा 1.5 गणन करते हैं:मार्शलिंग enum JAXB का उपयोग कर एक्सएमएल में विशेषताओं और JAXWS एनोटेशन

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

मैं अपाचे CXF और उत्पन्न डबल्यूएसडीएल उपयोग कर रहा हूँ, उम्मीद के रूप में, एक प्रतिबंध में ऊपर उल्लिखित enum तब्दील :

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

अब तक इतना अच्छा है और यह एक वांछनीय विशेषता है। मुझे लगता है कि अपाचे सीएक्सएफ (पिछली बार जब मैंने एक्सफायर का इस्तेमाल किया था) से पहले ऐसी संरचनाओं के साथ संघर्ष करना याद रखना था।

हालांकि, यह मामला यहां नहीं है। मैं एक अलग परिणाम देना चाहता हूँ। मैं चाहता हूं कि enum को कॉम्प्लेक्स प्रकार में अनुवादित किया जाए और दोनों गुण कोड और संदेश को एक्सएमएल तत्वों में अनुवादित किया जाता है जब इस गणना के उदाहरण वाले ऑब्जेक्ट को मार्शल किया जाता है। मैं केवल यह चाहता हूं कि यह एक enum की तरह व्यवहार न करें। मुझे पता है कि मैं इसे पूरा कर सकता हूं अगर मैंने एक enum के बजाय एक सादा वर्ग का उपयोग किया। हालांकि, मैं इसे एक enum रखना चाहता हूं इसलिए मैंने इसे कोड के जावा-भाग में टाइप-सुरक्षित रखा।

यदि उत्पन्न डब्लूएसडीएल को अभी भी संभावित मूल्यों के रूप में प्रतिबंध हो सकता है, तो यह एक आदर्श परिदृश्य होगा। हालांकि, मैं इसके बिना कर सकता था। यहां मुख्य बात यह है कि इसे जावा 1.5 एनम रखना होगा, जबकि अभी भी मार्शलिंग (और डब्लूएसडीएल उत्पन्न करना) रिटर्नकोड को कॉम्प्लेक्स टाइप के रूप में कोड और संदेश के साथ अपने तत्वों के रूप में रखना होगा।

मैंने संकेत दिया कि enum स्रोत कोड में दिए गए JAXWS एनोटेशन के साथ। क्या यह किसी भी तरह से उन (या कुछ अन्य) एनोटेशन के साथ पूरा करना संभव है? या मुझे एक कस्टम मार्शलर/अनमारशल्लर और डब्लूएसडीएल जेनरेटर लिखना होगा?

बहुत बहुत धन्यवाद!

सादर, अपने जावा सर्वर कोड में

फिलिपे Fedalto

+1

मैं सिर्फ गलती से एक और इसी तरह सवाल पर ठोकर खाई है। मुझे इसे अपने खोज परिणामों में नहीं मिला है क्योंकि शब्द काफी अलग हैं। यह वही नहीं है जो मैं ढूंढ रहा हूं, लेकिन यह निश्चित रूप से वहां आधे रास्ते ला सकता है। वैसे भी, इसमें @XmlJavaTypeAdapter का उपयोग शामिल है। आप इसे [एनम्स के लिए कस्टम वैल्यू सीरियलाइजेशन] में ढूंढ सकते हैं (http://stackoverflow.com/questions/4656992/providing- कस्टम-value-serialization-for-enums-via-jaxb) –

उत्तर

0

उपयोग enums और आप सेवा के इंटरफेस में जटिल प्रकार के लिए अनुवाद करते हैं।

उदाहरण:

@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 
} 
संबंधित मुद्दे