2012-06-19 6 views
7

मैं वसंत-डब्ल्यूएस के लिए नया हूं, और धीरे-धीरे मेरे सिर को इसके चारों ओर लपेट रहा हूं। अभी, मैं एक मौजूदा डब्ल्यूएस के साथ संवाद करने के लिए एक साधारण ग्राहक लिख रहा हूं। मैं WebServiceTemplate और marshalSendAndReceive विधि का उपयोग कर रहा हूं। सब कुछ ठीक काम करता है।एक FaultMessageResolver में एक SOAP गलती unmarshal कैसे?

हालांकि, जब एक एसओएपी गलती होती है, तो डब्लूएसटी एक साबुनफॉल्ट क्लाइंट अपवाद फेंकता है। मैंने देखा कि एसओएपी गलती के भीतर क्या है, यह जांचने के लिए मैं अपना खुद का FaultMessageResolver बना सकता हूं।

JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault"). Expected elements are .... 

जाहिर है, मेरी unmarshaller ठीक से विन्यस्त नहीं है: हालांकि, जब मैं अपने FaultMessageResolver में WebServiceMessage unmarshal करने की कोशिश, मैं निम्नलिखित त्रुटि संदेश मिलता है। क्या मुझे xjc का उपयोग कर जेएक्सबी गलती मॉडल उत्पन्न करना है, फिर त्रुटि को अनमर्शल करने में सक्षम होना चाहिए? मैं कुछ हद तक आश्चर्यचकित हूं कि यह पहले से मौजूद नहीं है।

क्या मेरे साबुन के भीतर से मेरी कस्टम त्रुटि जानकारी अतिरिक्त करने का कोई बेहतर तरीका है: गलती प्रतिक्रिया? मेरी त्रुटि निम्न की तरह कुछ दिखती है और मैं सेवा एरर आइटम निकालने/एक्सेस करने का प्रयास कर रहा हूं।

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
     <faultcode>soap:Server</faultcode> 
     <faultstring>Blaze Data Error</faultstring> 
     <detail> 
      <ns14:serviceErrors xmlns="http://www.nb.com/ClientServices/LendingSimulation/CalculateProfitabilityRequest" xmlns:ns13="http://www.nb.com/fw/errorMgmt" xmlns:ns14="http://www.nb.com/ClientServices/LendingSimulation/V1" > 
       <ns13:faultstring>ServiceExecutionError</ns13:faultstring> 
       <ns13:serviceError> 
        <ns13:errorCode>C10F1013</ns13:errorCode> 
        <ns13:errorType>B</ns13:errorType> 
        <ns13:errorMessage>Unable to retreive additional data</ns13:errorMessage> 
        <ns13:fieldName>Message error received from PHClient : [An unexpected error code was received : system=PH context=[empty]]</ns13:fieldName> 
        <ns13:systemId>Calculator</ns13:systemId> 
        <ns13:time>2012-06-19 14:45:10.151-0400</ns13:time> 
       </ns13:serviceError> 
      </ns14:serviceErrors> 
     </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

धन्यवाद!

एरिक

उत्तर

4

त्रुटि आप हो रही है के आधार पर, ऐसा लगता है कि आप XML स्रोत <soap:Fault> नोड के साथ शुरू unmarshall करने की कोशिश कर रहे हैं। अपने जावा कोड को देखे बिना, इसका मतलब है कि आप शायद message.getSoapBody().getFault()

से स्रोत को अनारशॉल करने का प्रयास कर रहे हैं, आपको <ns14:serviceErrors> नोड पर जाने के लिए वास्तव में गहराई से जाना होगा। आप शायद नहीं सभी को एक बार निम्न पथ द्वारा इस के लिए प्राप्त करने में सक्षम होना चाहिए ... :)

message.getSoapBody().getFault().getFaultDetail().getDetailEntries().next() 
+0

धन्यवाद। यह बहुत कुछ है जो मैं कर रहा था। लेकिन यह एक समय में केवल एक गलती जानकारी प्राप्त करता है, जिसे मैंने सोचा था कि बहुत अजीब था। मैं कुछ सिस्टम की उम्मीद करता था कि मैं सभी दोषों को एक सूची या दोषों की सरणी में अनारक्षित कर दूं। –

2

मैं org.springframework.ws.client.core.WebServiceTemplate उपयोग कर रहा हूँ। मैं Fault unmarshalling के साथ एक ही मुद्दे में भाग गया। मैंने WebServiceTemplate संपत्ति checkConnectionForFault से false पर सेट करके इस समस्या का समाधान किया। तो मेरे मामले में यह संभवतः सर्वर द्वारा गलती के लिए स्थिति 500 ​​वापस नहीं कर रहा था।

फिर spring-ws ने गलती को पार किया और इसे डिफ़ॉल्ट FaultMessageResolver पर पास कर दिया और मुझे पकड़ने के लिए नियमित SoapFaultClientException मिला।

लेकिन है कि मुझे केवल गलती के संदेश मिला तो मैं भी एक कस्टम FaultMessageResolver जोड़ सकते हैं और उसी तर्ज पर संदेश को निकालने के लिए किया था:

SoapFaultDetail faultDetail = ((SoapMessage) message).getSoapBody().getFault().getFaultDetail(); 
Iterator<SoapFaultDetailElement> detailEntries = faultDetail.getDetailEntries(); 
StringBuilder errorMessage = new StringBuilder(); 

while (detailEntries.hasNext()) { 
    SoapFaultDetailElement detailElement = detailEntries.next(); 
    Node node = ((DOMResult) detailElement.getResult()).getNode(); 
    CustomServiceFault serviceFault = (CustomServiceFault) marshaller.unmarshal(new DOMSource(node)); 
    errorMessage.append(serviceFault.getErrorCode() + ": " + serviceFault.getErrorMessage()); 
} 
throw new CustomException(errorMessage.toString()); 

marshaller के लिए इस्तेमाल किया वैसा ही है जैसा WebserviceTemplate

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