2010-08-09 13 views
5

मैं एक सोप सेवा है, अनुरोध और प्रतिक्रियाओं काम अच्छा इनपुट के साथ की उम्मीद के रूप में, अगर मैं एक XML तत्वस्प्रिंग वेब सेवा - अपवाद लंघन ExceptionResolver

के लिए बुरा इनपुट निर्दिष्ट अनुरोध शरीर में:

... 
<ns:myIntegerElement>asdf</ns:myIntegerElement> 
... 

मेरी अपवाद समाधानकर्ता शुरू हो जाती है, इस समाधानकर्ता सिर्फ अपवाद रिसोल्वर के एक कार्यान्वयन है, तो यह अपवाद मैपिंग, बस कुछ ही System.out की जरूरत नहीं है सार विधि में

<bean id="exceptionResolver" class="com.mycompany.ws.MyExceptionResolver"> 

लेकिन, अगर मैं एक अनुरोध है कि अधिक इस तरह दिखता भेजें:

... 
    <ns:myIntegSOMETHINGGOTTOTALLYMESSUP!!!ent>asdf</ns:myIntegerElement> 
... 

मेरी समाधानकर्ता सभी

मैं सेटअप log4j पर क्रियान्वित नहीं कर रहा है एक रूट डिबग स्तर है और इस उत्पादन को देखने के लिए:

2010-08-09 10:30:01,900 [Thread:http-8080-2] DEBUG [org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter] - Accepting incoming [[email protected]cf] to [ http://localhost:8080/myws/MyWebServices/] ERROR: 'The element type "ns:MESSEDUPELEMENT" must be terminated by the matching end-tag "".' 2010-08-09 10:30:01,920 [Thread:http-8080-2] DEBUG [org.springframework.ws.transport.http.MessageDispatcherServlet] - Could not complete request org.springframework.ws.soap.saaj.SaajSoapMessageException: Could not access envelope: Unable to create envelope from given source: ; nested exception is com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source: at org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion(SaajUtils.java:162) at org.springframework.ws.soap.saaj.SaajSoapMessage.getImplementation(SaajSoapMessage.java:251) at org.springframework.ws.soap.saaj.SaajSoapMessage.(SaajSoapMessage.java:84) at org.springframework.ws.soap.saaj.SaajSoapMessage.(SaajSoapMessage.java:70) at org.springframework.ws.soap.saaj.SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java:168) at org.springframework.ws.transport.AbstractWebServiceConnection.receive(AbstractWebServiceConnection.java:90) at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:86) at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57) at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) at java.lang.Thread.run(Thread.java:619) Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source: at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:114) at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(SOAPPart1_1Impl.java:70) at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:122) at org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion(SaajUtils.java:159) ... 24 more Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: The element type "smm:smm-aid" must be terminated by the matching end-tag "". at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:719) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313) at com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:393) at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:102) ... 27 more Caused by: org.xml.sax.SAXParseException: The element type "smm:smm-aid" must be terminated by the matching end-tag "". at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707) ... 30 more

ऐसा प्रतीत होता है कि वसंत में यहां एक संभावित अपवाद गुम है, और इसे लपेट नहीं रहा है, लेकिन ऐसी मूल त्रुटि स्थिति पकड़ी नहीं जा रही है जो मुझे असंभव लगता है। क्या कोई मुझे इस मुद्दे की जड़ खोजने में मदद कर सकता है?

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <servlet> 
     <servlet-name>ws</servlet-name> 
     <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
     <init-param> 
      <param-name>transformWsdlLocations</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ws</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

सर्वलेट संदर्भ:

<context:component-scan base-package="com.mycomp.proj.ws" /> 
    <bean id="smmService" class="com.mycomp.proj.ws.SMMRequestHandlingServiceStubImpl"/> 

    <bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"/> 
    <bean class="org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter"> 
     <constructor-arg ref="marshaller"/> 
    </bean> 
    <bean id="marshaller" class="org.springframework.oxm.castor.CastorMarshaller"> 
     <property name="mappingLocations"> 
      <list> 
       <value>classpath:mapping.xml</value> 
       <value>classpath:hoursOfOperationMapping.xml</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="smmws" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"> 
     <property name="schema" ref="schema" /> 
     <property name="portTypeName" value="SMM" /> 
     <property name="locationUri" value="/SMMWebServices/"/> 
     <property name="targetNamespace" value="http://mycomp.proj.com" /> 
    </bean> 

    <bean id="exceptionResolver" class="com.wdp.smm.ws.MyExceptionResolver"/> 

    <bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema"> 
     <property name="xsd" value="/WEB-INF/ws.xsd" /> 
    </bean> 

उत्तर

4

मैंने आपके प्रश्न पर अधिक बारीकी से देखा है और मुझे लगता है कि मुझे पता है कि क्या हो रहा है। आप अपवाद हैंडलर को नहीं कहा जाता है क्योंकि यह साबुन प्रसंस्करण में उच्च स्तर पर है।आप देखते हैं, WebServiceMessageReceiverHandlerAdapter प्रक्रिया को संसाधित करने के लिए इसे मार्शलर को भेजने से पहले आने वाली स्ट्रिंग को एक्सएमएल में डीकोड करने का प्रयास करता है। चूंकि एक्सएमएल अमान्य है इसलिए कॉल विफल हो जाती है। और चूंकि WebServiceMessageReceiverHandlerAdapter अपवाद हैंडलर का समर्थन नहीं करता है, यह केवल "SaajSoapMessageException" अपवाद को पुनर्स्थापित करता है।

अब आप क्या कर सकते हैं एक नई कक्षा है जो WebServiceMessageReceiverHandlerAdapter को विस्तारित करती है, लेकिन यह एक अपवाद है जो आपके अपवाद हैंडलर का उपयोग करने वाले प्रयास/पकड़ में हैंडल कनेक्शन() को लपेटता है।


वैसे, इस तरह की समस्या को डीबग करते समय मेरा दृष्टिकोण log4j में विधि विधि और रेखा संख्या दोनों को आउटपुट करना है। साथ ही वसंत स्रोतों को डाउनलोड करना।

+0

कुछ याद नहीं आ रहा है, लेकिन मैं वसंत को उस कार्यान्वयन का उपयोग करने के लिए कैसे कहूंगा? मुझे कोई भी स्थान नहीं दिख रहा है जहां यह कॉन्फ़िगर करने योग्य – walnutmon

+0

है, मैं जोड़ना चाहता हूं कि आप पूरी तरह से सही हैं, हालांकि मेरे पास वास्तव में इस समस्या को ठीक करने का कोई समाधान नहीं है, मुझे यकीन नहीं है कि WebServiceMessageReceiverHandlerAdapter के मेरे कार्यान्वयन का लाभ उठाने के लिए कैसे मेरी वेब सेवा प्रोजेक्ट, जिस तरह से मैं इसे समझता हूं केवल कुछ बीन्स servlet-context.xml के भीतर स्वचालित रूप से उठाए जाते हैं। इस हफ्ते मैं इस उप-वर्गीकृत बीन को संदर्भ फ़ाइल में बस परिभाषित करने की कोशिश करूंगा और देख सकता हूं कि इसका उपयोग स्वचालित रूप से किया जाता है, अगर आपको लगता है कि आपको पता है कि ओवरराइड कैसे करें मुझे बताएं, और बक्षीस आपका है – walnutmon

+0

मैंने अभी जोड़ा है (तीन साल बाद) [मेरे उत्तर] में एक उदाहरण कार्यान्वयन (http://stackoverflow.com/a/19024207/365237), यह साबित करना कि यह उत्तर सही है। – eis

-1

आपके पास करने के लिए "तार" (या

मैं web.xml और servlet.xml भी शामिल करेंगे अपने इंजेक्शन सेम में अपवाद हैंडलर "इंजेक्ट करें")। मुझे यकीन नहीं है कि आपके वसंत बीन में से कौन सा वास्तव में अपवाद हैंडलर की आवश्यकता है।

व्यक्तिगत रूप से, मैं default-autowire="byName" का उपयोग करता हूं, जो मेरा अपवाद हैडलर को मेरे नियंत्रक वर्ग में स्वचालित रूप से तारित किया जाता है। आपका दृष्टिकोण वास्तव में मैनुअल तारों का उपयोग करें। तो आपको यह पता लगाना होगा कि कौन से बीन को वास्तव में अपवाद हैंडलर का उपयोग करना चाहिए।

<bean class="org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter"> 
    <constructor-arg ref="marshaller"/> 
    <property name="exceptionHandler" ref="exceptionHandler" /> 
</bean> 

या फिर आप वसंत के autowired तंत्र जोड़ने और इसे सेम स्वचालित रूप से तार दे सकता है: क्या आप की कोशिश की (सिर्फ मेरे सिर के ऊपर) है। :)

+0

यह बात यह है कि वसंत संदर्भ पर जरूरत है अपवाद रिज़ॉल्वर जिसे मैंने परिभाषित किया है स्वचालित रूप से एसओएपी कॉल के जीवन चक्र के दौरान उपयोग किया जाता है, हालांकि अपवाद जिसे मैंने ट्रेस दिया है, किसी कारण से इसे संभाला नहीं जाता है। या तो ऐसा इसलिए है क्योंकि रिज़ॉल्यूवर जीवन चक्र में अपवादों को अभी तक संभाल नहीं पाता है, या यह अपवाद किसी भी तरह से बेकार हो रहा है। – walnutmon

+0

मैं यह इसलिए कहता हूं क्योंकि मार्शलिंग मोडसएंडपॉइंट एडाप्टर में "अपवाद हैंडलर" संपत्ति नहीं है, इसलिए आप इस फैशन में इंजेक्ट नहीं कर सकते हैं, जब तक कि मुझे – walnutmon

1

मुझे वसंत-सुरक्षा के साथ काम करते समय इस तरह की समस्या में चलना याद है। मुझे कुछ अपवादों के तहत अपने अपवाद समाधानकर्ता के साथ भी समस्याएं नहीं आ रही थीं।

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

मुझे लगता है कि आप यहां कुछ ऐसा से पीड़ित हैं, जहां लिफाफा पार्स त्रुटियां अपवाद रिज़ॉल्वर फ़िल्टर को आविष्कार करने से पहले होती हैं। यदि ऐसा है, तो आपको उन अपवादों को संभालने के किसी अन्य तरीके का सहारा लेना होगा, उदाहरण के लिए एक वेनिला सर्वलेट फ़िल्टर।

0

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

public class CustomMessageDispatcherServlet extends MessageDispatcherServlet { 

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    try { 
     super.doService(request, response); 
    } catch (Exception e) { 
     String error = e.getMessage(); 
     String errorXml = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + 
           "<SOAP-ENV:Header/>" + 
            "<SOAP-ENV:Body>" + 
             "<SOAP-ENV:Fault>" + 
              "<faultcode>SOAP-ENV:Client</faultcode>" + 
              "<faultstring xml:lang=\"en\"></faultstring>" + error + 
             "</SOAP-ENV:Fault>" + 
            "</SOAP-ENV:Body>" + 
           "</SOAP-ENV:Envelope>"; 
     response.setStatus(HttpServletResponse.SC_OK); 
     response.setContentType("text/xml"); 
     response.getWriter().write(errorXml); 
     response.getWriter().flush(); 
    } 
} 

}

आप केवल अपवाद आप हैंडल करना चाहते हैं पकड़ने के लिए चाहते हो सकता है।

वेब.एक्सएमएल फ़ाइल में अपने कस्टम मैसेज डिस्पैटर सर्वलेट के साथ org.springframework.ws.transport.http.MessageDispatcherServlet को बदलें।

<servlet> 
    <servlet-name>web-services</servlet-name> 
    <servlet-class>CustomMessageDispatcherServlet</servlet-class> 
</servlet> 
+0

डिफ़ॉल्ट रूप से मेरे लिए काम नहीं करता है, org.springframework.ws.transport.http.MessageDispatcherServlet स्वयं अपवाद को पकड़ लेगा और केवल प्रतिक्रिया कोड सेट करेगा। इसके कारण, अपवाद कभी भी कस्टम प्रेषक सर्वलेट नहीं होते हैं। – eis

5

MessageDispatcherServlet डिफ़ॉल्ट रूप से EnpointExceptionResolver के अपने स्वयं के दो उदाहरणों बनाता है, अर्थात् SoapFaultAnnotationExceptionResolver @ 1 और SimpleSoapExceptionResolver 2

@ और जब यह एक अपवाद का समाधान करता है SimpleSoapExceptionResolver @ 2 किसी अन्य पंजीकृत EnpointExceptionResolver बंद हो जाएगा अपवाद को संभालने के लिए।

यह मेरे शर्मनाक लंबे यह पता लगाने की ले लिया है, लेकिन आप यह करने के लिए है इस सवाल का जवाब काफी सरल है, अपने सर्वलेट संदर्भ में है:

<bean id="exceptionResolver" class="com.wdp.smm.ws.MyExceptionResolver"> 
    <property name="order" value="1"/> 
</bean> 
1

मुझे लगता है कि क्या @ थियरी-दिमित्री-रॉय समझाया सही है हालांकि, मुझे वास्तव में इसे लागू करने में बहुत सारे मुद्दे थे। उदाहरण के लिए, हैंडल कॉन्फ़्रेंस विधि को लपेटना पर्याप्त नहीं है क्योंकि नोएन्डपॉइंटफॉन्डेक्सप्शन को फेंक नहीं दिया जा रहा है। चूंकि यह अपवादों को अच्छी तरह से संभालने का अधिक सामान्य मुद्दा है, इसलिए मैं भविष्य में पीढ़ियों के लिए दर्द को कम करने के लिए यहां अपना कोड डाल रहा हूं। यह वसंत -6 2.1.3 और जेबॉस एएस 7 के साथ परीक्षण किया जाता है।

मेरा संदेश हैंडलर प्रतिक्रिया कोड 200.

package fi.eis.applications.spring.soap.server.transport.http; 

import java.io.IOException; 
import java.net.URISyntaxException; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.lang3.StringEscapeUtils; 
import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.core.Ordered; 
import org.springframework.web.servlet.HandlerAdapter; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.ws.FaultAwareWebServiceMessage; 
import org.springframework.ws.InvalidXmlException; 
import org.springframework.ws.NoEndpointFoundException; 
import org.springframework.ws.WebServiceMessage; 
import org.springframework.ws.WebServiceMessageFactory; 
import org.springframework.ws.context.DefaultMessageContext; 
import org.springframework.ws.context.MessageContext; 
import org.springframework.ws.support.DefaultStrategiesHelper; 
import org.springframework.ws.transport.EndpointAwareWebServiceConnection; 
import org.springframework.ws.transport.FaultAwareWebServiceConnection; 
import org.springframework.ws.transport.WebServiceConnection; 
import org.springframework.ws.transport.WebServiceMessageReceiver; 
import org.springframework.ws.transport.context.DefaultTransportContext; 
import org.springframework.ws.transport.context.TransportContext; 
import org.springframework.ws.transport.context.TransportContextHolder; 
import org.springframework.ws.transport.http.HttpServletConnection; 
import org.springframework.ws.transport.http.HttpTransportConstants; 
import org.springframework.ws.transport.http.MessageDispatcherServlet; 
import org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter; 
import org.springframework.ws.transport.support.TransportUtils; 

/** 
* Adapter to map XML parsing and other low-level errors to SOAP faults instead of 
* server standard error pages. Also, this class will always use return code HTTP_OK 
* (status 200) to requests, even if there are errors. 
* 
*/ 
public class MyWebServiceMessageReceiverHandlerAdapter 
    extends WebServiceMessageReceiverHandlerAdapter 
    implements HandlerAdapter, Ordered, InitializingBean, ApplicationContextAware { 

    private ApplicationContext context; 
    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
      throws BeansException { 
     this.context = applicationContext; 
    } 

    @Override 
    public void afterPropertiesSet() { 
     DefaultStrategiesHelper defaultStrategiesHelper = new DefaultStrategiesHelper(MessageDispatcherServlet.class); 
     WebServiceMessageFactory factory = defaultStrategiesHelper 
       .getDefaultStrategy(WebServiceMessageFactory.class, context); 
     setMessageFactory(factory); 
    } 

    public ModelAndView handle(HttpServletRequest httpServletRequest, 
           HttpServletResponse httpServletResponse, 
           Object handler) throws Exception { 
     if (HttpTransportConstants.METHOD_POST.equals(httpServletRequest.getMethod())) { 
      WebServiceConnection connection = new MyWebServiceConnection(httpServletRequest, httpServletResponse); 
      try { 
       overriddenHandleConnection(connection, (WebServiceMessageReceiver) handler); 
      } catch (InvalidXmlException ex) { 
       handleInvalidXmlException(httpServletRequest, httpServletResponse, handler, ex); 
      } catch (Exception ex) { 
       handleGeneralException(httpServletRequest, httpServletResponse, handler, ex); 
      } 
     } 
     else { 
      handleNonPostMethod(httpServletRequest, httpServletResponse, handler); 
     } 
     return null; 
    } 


    /** 
    * Overridden version of handleConnection from WebServiceMessageReceiverObjectSupport to be able to handle 
    * missing endpoint ourselves. That method is final, so we need to use another method here. 
    * 
    * This has been reported as https://jira.springsource.org/browse/SWS-850 
    * 
    * @param connection 
    * @param receiver 
    * @throws Exception 
    */ 
    protected void overriddenHandleConnection(WebServiceConnection connection, WebServiceMessageReceiver receiver) 
      throws Exception { 
     logUri(connection); 
     TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); 
     TransportContextHolder.setTransportContext(new DefaultTransportContext(connection)); 

     try { 
      WebServiceMessage request = connection.receive(getMessageFactory()); 
      MessageContext messageContext = new DefaultMessageContext(request, getMessageFactory()); 
      receiver.receive(messageContext); 
      if (messageContext.hasResponse()) { 
       WebServiceMessage response = messageContext.getResponse(); 
       if (response instanceof FaultAwareWebServiceMessage && 
         connection instanceof FaultAwareWebServiceConnection) { 
        FaultAwareWebServiceMessage faultResponse = (FaultAwareWebServiceMessage) response; 
        FaultAwareWebServiceConnection faultConnection = (FaultAwareWebServiceConnection) connection; 
        faultConnection.setFault(faultResponse.hasFault()); 
       } 
       connection.send(messageContext.getResponse()); 
      } 
     } 
     catch (NoEndpointFoundException ex) { 
      if (connection instanceof EndpointAwareWebServiceConnection) { 
       ((EndpointAwareWebServiceConnection) connection).endpointNotFound(); 
      } 
      throw ex; 
     } 
     finally { 
      TransportUtils.closeConnection(connection); 
      TransportContextHolder.setTransportContext(previousTransportContext); 
     } 
    } 

    private void logUri(WebServiceConnection connection) { 
     if (logger.isDebugEnabled()) { 
      try { 
       logger.debug("Accepting incoming [" + connection + "] at [" + connection.getUri() + "]"); 
      } 
      catch (URISyntaxException e) { 
       // ignore 
      } 
     } 
    } 



    private void handleGeneralException(
      HttpServletRequest httpServletRequest, 
      HttpServletResponse response, Object handler, 
      Exception ex) throws IOException { 
     writeErrorResponseWithMessage(response, ex.getClass().getName() + ": " + ex.getMessage()); 
    } 

    /** 
    * By default, sets SC_BAD_REQUEST as response in Spring, so overwritten to 
    * provide HTTP_OK and reasonable SOAP fault response. 
    */ 
    protected void handleInvalidXmlException(
      HttpServletRequest httpServletRequest, 
      HttpServletResponse response, Object handler, InvalidXmlException ex) 
      throws IOException { 
     writeErrorResponseWithMessage(response, ex.getClass().getName() + ": " + ex.getMessage()); 
    } 

    /** 
    * By default, sets SC_METHOD_NOT_ALLOWED as response in Spring, so overwritten to 
    * provide HTTP_OK and reasonable SOAP fault response. 
    */ 
    protected void handleNonPostMethod(HttpServletRequest httpServletRequest, 
             HttpServletResponse response, 
             Object handler) throws Exception { 
     writeErrorResponseWithMessage(response, "HTTP Method not allowed"); 
    } 

    private void writeErrorResponseWithMessage(HttpServletResponse response, String message) 
      throws IOException { 
     String errorXml = String.format(
       "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" 
       +" <SOAP-ENV:Header/>" 
       +" <SOAP-ENV:Body>" 
       +"  <SOAP-ENV:Fault>" 
       +"   <faultcode>SOAP-ENV:Client</faultcode>" 
       +"   <faultstring xml:lang=\"en\">%s</faultstring>" 
       +"  </SOAP-ENV:Fault>" 
       +" </SOAP-ENV:Body>" 
       +"</SOAP-ENV:Envelope>", 
       StringEscapeUtils.escapeXml(message) 
       ); 

     response.setStatus(HttpServletResponse.SC_OK); 
     response.setContentType("text/xml"); 
     response.getWriter().write(errorXml); 
     response.getWriter().flush(); 
    } 
    @Override 
    public int getOrder() { 
     return 1; 
    } 

    /** 
    * This class is needed as org.springframework.ws.transport.http.HttpServletConnection will throw an 
    * exception if it is used outside Spring framework files. However, extending it and using the same 
    * implementation seems to be fine. 
    * 
    */ 
    static class MyWebServiceConnection extends HttpServletConnection { 
     protected MyWebServiceConnection(HttpServletRequest httpServletRequest, 
       HttpServletResponse httpServletResponse) { 
      super(httpServletRequest, httpServletResponse); 
     } 
    }  
} 

यह भी सही ढंग से कॉन्फ़िगर किए जाने की आवश्यकता के साथ साबुन दोष करने के लिए सभी समस्याओं बदल देता है।

<!-- 'messageReceiverHandlerAdapter' is a magic name spring-ws 
    org.springframework.ws.transport.http.MessageDispatcherServlet 
    will bind to --> 
<bean id="messageReceiverHandlerAdapter" 
    class="fi.eis.applications.spring.soap.server.transport.http.MyWebServiceMessageReceiverHandlerAdapter"> 
</bean> 
0

नवीनतम स्प्रिंग WS संस्करण आप कस्टम वेब सेवा संदेश श्रोता

public class CustomWebServiceMessageListener extends WebServiceMessageListener { 

private static final Logger LOG = LoggerFactory.getLogger(CustomWebServiceMessageListener.class); 

@Override 
public void onMessage(Message message, Session session) throws JMSException { 
    try { 
     this.handleMessage(message, session); 
    } catch (JmsTransportException jmsTransportException) { 
     LOG.error(jmsTransportException.getMessage(), jmsTransportException); 
    } catch (Exception e) { 
     JMSException jmsException = new JMSException(e.getMessage()); 
     jmsException.setLinkedException(e); 
     LOG.error(e.getMessage(), e); 
    } 
    } 
} 

का उपयोग और इस तरह यह इंजेक्षन सकते हैं:

<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="concurrentConsumers" value="#{properties.concurrentListeners}"/> 

    <property name="connectionFactory" ref="connectionFactory"/> 
    <property name="destination" ref="queue"/> 
    <property name="messageListener" ref="messageListener"/> 
    <property name="sessionTransacted" value="true"/> 

</bean> 

<bean id="messageListener" class="com.yourproject.transport.CustomWebServiceMessageListener"> 
    <property name="messageFactory" ref="saajMessageFactory"/> 
    <property name="messageReceiver" ref="messageDispatcher"/> 
</bean> 
संबंधित मुद्दे