2012-04-17 22 views
9

मैं कुछ वेब-आधारित अनुप्रयोगों पर काम कर रहा हूं और मुझे अपाचे सीएक्सएफ unmarshalling के बारे में एक सवाल है। हमारी परियोजना में हम सीएक्सएफ 2.4.1 संस्करण का उपयोग करते हैं।सीएक्सएफ त्रुटि हैंडलिंग ओवरराइड

जब कुछ सोप अनुरोध गलत है CXF मानक SOAPFaultException और सोप प्रतिक्रिया फेंकता है जैसे मानक क्षेत्रों के साथ बनाया गया है (उदाहरण के लिए कुछ फ़ील्ड संख्यात्मक के बजाय पाठ है):

<soap:Fault> 
    <faultcode>soap:Client</faultcode> 
    <faultstring>Unmarshalling Error: some field missing</faultstring> 
</soap:Fault> 

परियोजना आवश्यकताओं कहते हैं कि किसी भी स्थिति के मामले में गलती सिस्टम की तरह, अन्य प्रारूप में जवाब की जरूरत है:

<soap:body> 
    <ResponseState> 
     <ErrorCode>2732</ErrorCode> 
     <ErrorMessage>Unmarshalling Error: some field missing</ErrorMessage> 
     <ErrorDetails> some details </ErrorDetails> 
     <some other fields> 
     ... 
    </ResponseState> 
</soap:body> 

तो सवाल यह है: मैं कैसे किसी भी तरह इस त्रुटि हैंडलिंग ओवरराइड और मेरे प्रारूप में प्रतिक्रिया कर सकते हैं, नहीं डिफ़ॉल्ट?

अग्रिम धन्यवाद।

पीएस मैंने कुछ ValidationEventHandler प्रिंसिपल को देखने की कोशिश की, लेकिन यह सीएक्सएफ 2.0 और उच्चतर में किसी अन्य तरीके से काम करता है।

उत्तर

6

ठीक है, तो बहुत सारे शोध के बाद मुझे सीएक्सएफ त्रुटि प्रबंधन के कुछ तरीके मिल गए हैं।

*। ValidationEventHandler आपको मानक एक के बजाय अपना अपवाद फेंकने की संभावना देता है। लेकिन आप प्रतिक्रिया व्यवहार को बदल नहीं सकते हैं और आप एसओएपी प्रतिक्रिया प्रारूप नहीं बदल सकते हैं।

*। त्रुटि प्रबंधन को बदलने का एक और तरीका है अपना स्वयं का इंटरसेप्टर बनाना। सीएक्सएफ वर्कफ़्लो इंटरसेप्टर की श्रृंखला पर बनाया गया है। 4 प्रकार के इंटरसेप्टर हैं: इनइंटरसेप्टर, आउटइंटरसेप्टर, इनफॉल्टइंटरसेप्टर और आउटफॉल्टइंटरसेप्टर।

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

लेकिन जहां तक ​​इन सभी इंटरसेप्टर मैन्युअल प्रतिक्रिया मैन्युअल रूप से (xmlWriter.writeStartElement() आदि) प्रत्येक प्रवाह चरण के लिए अपने स्वयं के इंटरसेप्टर लिखना एक बड़ी चुनौती हो सकती है। यह काम का असली विशाल गुच्छा हो सकता है।

दुर्भाग्यवश, मुझे सीएक्सएफ इंटरसेप्टर्स के बारे में अच्छा संदर्भ नहीं मिला है।

एक और बात - यदि आपको SOAPFaultException की बजाय नियमित प्रतिक्रिया वापस करने की आवश्यकता है तो आपको अतिरिक्त जानकारी की आवश्यकता हो सकती है: वास्तविक प्रतिक्रिया जो इस प्रतिक्रिया को लौटाती है, सेवा पैरामीटर अनुरोध में पारित किया गया है। मुझे यह जानकारी इंटरसेप्टर्स में सुलभ पैरामीटर में नहीं मिली है । और, निश्चित रूप से, ऐसा करके आप क्लाइंट कोड धोखा देते हैं जो वास्तविक अपवाद के बजाय ठीक हो जाएगा।

*। टेक्स्ट के रूप में सभी पैरा के साथ अपने wsdl को डिज़ाइन करना बहुत अच्छा समाधान नहीं हो सकता है:

ए। Wsdl में कोई डेटा प्रकार और सत्यापन नियम नहीं होने पर आपकी सेवाओं का उपभोक्ता वास्तव में भ्रमित हो सकता है।

बी। सत्यापन के लिए आपको 'पहिया को फिर से शुरू करने' की आवश्यकता होगी। मेरा मतलब है कि आपको अपने स्वयं के सत्यापनकर्ता को कोड करना होगा जो कुछ जटिल नियमों के साथ बहुत मुश्किल हो सकता है। साथ ही एक्सएसडी में इन सभी मान्यताओं को कार्यान्वित किया गया है और अच्छी तरह से परीक्षण किया गया है।

और आखिर में मेरी स्थिति के बारे में: हमने इसकी आवश्यकता प्रबंधक के साथ चर्चा की और सीएक्सएफ ने अपने मानक अपवाद फेंकने की अनुमति देने का फैसला किया अगर एक्सएमएल स्कीमा आवश्यकताओं के अनुरोध में उल्लंघन किया गया। यह अच्छा समाधान है क्योंकि अब हम एक्सएसडी सत्यापन की सभी शक्तियों का उपयोग कर रहे हैं और जटिल और बेकार काम पर अपना समय बर्बाद नहीं करते हैं।

उत्तर के लिए @ericacm का बहुत धन्यवाद।

+0

इस मुद्दे पर किए गए शोध को सारांशित करने के लिए धन्यवाद। अब मुझे एक समान चुनौती का सामना करना पड़ रहा है। – Withheld

1

आप निश्चित रूप से ValidationEventHandler का उपयोग कर डिफ़ॉल्ट से बेहतर त्रुटि प्रतिक्रिया उत्पन्न कर सकते हैं और एक Fault फेंक सकते हैं जो JAX-WS Fault spec के अनुरूप है। लेकिन यह आपको केवल इतना अनुकूलन की अनुमति देगा - कुछ तत्व होंगे जिन पर आपका कोई नियंत्रण नहीं है।

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
     <faultcode>soap:Client</faultcode> 
     <faultstring>Errors in request</faultstring> 
     <detail> 
      <ns2:ValidationFault xmlns:ns2="http://notification.ws.foo.com/"> 
       <errors> 
        <error> 
        <inputElement>topicId</inputElement> 
        <errorMessage>java.lang.NumberFormatException: For input string: "" [line:6]</errorMessage> 
        </error> 
       </errors> 
      </ns2:ValidationFault> 
     </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

आप <soap:Fault>, <faultcode> and <faultstring> तत्वों के बारे में कुछ नहीं कर सकते: उदाहरण के लिए, यहाँ मेरी ऐप्स से ValidationEventHandler प्रतिक्रिया है। लेकिन <ValidationFault> से </ValidationFault> सब कुछ कस्टम है।

यदि आपको प्रतिक्रिया पर अधिक विस्तृत नियंत्रण की आवश्यकता है तो आपको फ़ील्ड प्रकार को संख्यात्मक से स्ट्रिंग में बदलना चाहिए और फिर अनारशेलर को त्रुटि पकड़ने के बजाय अपने कोड में सत्यापन करना चाहिए।

हां, मैं मानता हूं कि इसे एक स्ट्रिंग होने के लिए मजबूर करना पड़ेगा, लेकिन यदि प्रतिक्रिया ठीक है, तो आपने जो कुछ भी ऊपर लिखा है, वह जेएक्स-डब्ल्यूएस परत की तुलना में सीएक्सएफ में गहराई से डाइविंग के बिना संभव नहीं होगा (उदाहरण के लिए एक इंटरसेप्टर का उपयोग कर)।

+0

उत्तर के लिए धन्यवाद। और मेरे पास इसके बारे में कुछ टिप्पणियां हैं। हां, ValidationEventHandler आपको मानक एक के बजाय अपना अपवाद फेंकने की संभावना देता है। लेकिन अगर आप प्रतिक्रिया संदेश को पूरी तरह से लिखना चाहते हैं तो यह आपकी मदद नहीं कर सकता है। लेकिन अगर हम सभी स्ट्रिंग तत्वों को प्राप्त करते हैं तो हमारे सभी जेनरेट किए गए ऑब्जेक्ट्स में इन सभी तारों को शामिल किया जाएगा और फिर हमें उन सभी को बदलने और सत्यापित करने के लिए 'पहिया को फिर से शुरू करने' की आवश्यकता होगी। दूसरी तरफ: हमारी वेब सेवाओं के उपभोक्ता कैसे समझेंगे कि खेतों के लिए क्या आवश्यकताएं हैं? डब्लूएसडीएल फाइल में टिप्पणियों के माध्यम से? तो, आईएमओ, तार वास्तव में अच्छा निर्णय नहीं है। –

+0

अद्यतन उत्तर। – sourcedelica

संबंधित मुद्दे