Веб-сервисы Spring - пропуск исключения ExceptionResolver

У меня есть сервис SOAP, запрос и работа ответов как ожидалось с хорошим входом, если я указываю плохо введенный для элемента XML

в теле запроса:

...
asdf
...

мой сопоставитель исключения вызывается, этот сопоставитель является просто реализацией сопоставителя исключения, таким образом, это не имеет отображений исключения, только некоторые System.out's в абстрактном методе


однако, если я отправляю запрос, который больше походит на это:

...
    asdf
...

мой сопоставитель не выполняется вообще

Я устанавливаю log4j, чтобы иметь корневой уровень отладки и видеть этот вывод:

09.08.2010 10:30:01  900 [Thread:http-8080-2] ОТЛАДКА [org.springframework.ws.transport.http. WebServiceMessageReceiverHandlerAdapter] - Принимающий входящий [org.springframework.ws.transport.http.HttpServletConnection@c46dcf] на [http://localhost:8080/myws/MyWebServices/] ОШИБКА: 'Тип элемента "ns:MESSEDUPELEMENT" должен быть завершен конечным тэгом соответствия ""'. 09.08.2010 10:30:01  920 [Thread:http-8080-2] ОТЛАДКА [org.springframework.ws.transport.http. MessageDispatcherServlet] - не Мог завершить запрос org.springframework.ws.soap.saaj. SaajSoapMessageException: не Мог получить доступ к конверту: Не удалось создать конверт из данного источника:; вложенная исключительная ситуация является com.sun.xml.internal.messaging.saaj. SOAPExceptionImpl: Не удалось создать конверт из данного источника: в org.springframework.ws.soap.saaj.support. SaajUtils.getSaajVersion(SaajUtils.java:162) в org.springframework.ws.soap.saaj. SaajSoapMessage.getImplementation(SaajSoapMessage.java:251) в org.springframework.ws.soap.saaj. SaajSoapMessage. (SaajSoapMessage.java:84) в org.springframework.ws.soap.saaj. SaajSoapMessage. (SaajSoapMessage.java:70) в org.springframework.ws.soap.saaj. SaajSoapMessageFactory.createWebServiceMessage(SaajSoapMessageFactory.java:168) в org.springframework.ws.transport. AbstractWebServiceConnection.receive(AbstractWebServiceConnection.java:90) в org.springframework.ws.transport.support. WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:86) в org.springframework.ws.transport.http. WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57) в org.springframework.ws.transport.http. MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230) в org.springframework.web.servlet. FrameworkServlet.processRequest(FrameworkServlet.java:571) в org.springframework.web.servlet. FrameworkServlet.doPost(FrameworkServlet.java:511) в javax.servlet.http. HttpServlet.service(HttpServlet.java:637) в javax.servlet.http. HttpServlet.service(HttpServlet.java:717) в org.apache.catalina.core. ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) в org.apache.catalina.core. ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) в org.apache.catalina.core. StandardWrapperValve.invoke(StandardWrapperValve.java:233) в org.apache.catalina.core. StandardContextValve.invoke(StandardContextValve.java:191) в org.apache.catalina.core. StandardHostValve.invoke(StandardHostValve.java:127) в org.apache.catalina.valves. ErrorReportValve.invoke(ErrorReportValve.java:102) в org.apache.catalina.core. StandardEngineValve.invoke(StandardEngineValve.java:109) в org.apache.catalina.connector. CoyoteAdapter.service(CoyoteAdapter.java:298) в org.apache.coyote.http11. Http11AprProcessor.process(Http11AprProcessor.java:859) в org.apache.coyote.http11. Http11AprProtocol$Http11ConnectionHandler.process (Http11AprProtocol.java:579) в org.apache.tomcat.util.net. AprEndpoint$Worker.run (AprEndpoint.java:1555) в java.lang. Thread.run (Поток java:619), Вызванный: com.sun.xml.internal.messaging.saaj. SOAPExceptionImpl: Не удалось создать конверт из данного источника: в com.sun.xml.internal.messaging.saaj.soap. EnvelopeFactory.createEnvelope(EnvelopeFactory.java:114) в com.sun.xml.internal.messaging.saaj.soap.ver1_1. SOAPPart1_1Impl.createEnvelopeFromSource (SOAPPart1_1Impl.java:70) в com.sun.xml.internal.messaging.saaj.soap. SOAPPartImpl.getEnvelope (SOAPPartImpl.java:122) в org.springframework.ws.soap.saaj.support. SaajUtils.getSaajVersion(SaajUtils.java:159)... 24 Более вызванных: javax.xml.transform. TransformerException: org.xml.sax. SAXParseException: тип элемента "smm:smm-помощь" должен быть завершен конечным тэгом соответствия "". в com.sun.org.apache.xalan.internal.xsltc.trax. TransformerImpl.transform(TransformerImpl.java:719) в com.sun.org.apache.xalan.internal.xsltc.trax. TransformerImpl.transform(TransformerImpl.java:313) в com.sun.xml.internal.messaging.saaj.util.transform. EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:393) в com.sun.xml.internal.messaging.saaj.soap. EnvelopeFactory.createEnvelope(EnvelopeFactory.java:102)... 27 Более вызванных: org.xml.sax. SAXParseException: тип элемента "smm:smm-помощь" должен быть завершен конечным тэгом соответствия "". в com.sun.org.apache.xerces.internal.parsers. AbstractSAXParser.parse(AbstractSAXParser.java:1231) в com.sun.org.apache.xerces.internal.jaxp. SAXParserImpl$JAXPSAXParser.parse (SAXParserImpl.java:522) в org.xml.sax.helpers. XMLFilterImpl.parse (XMLFilterImpl.java:333) в com.sun.org.apache.xalan.internal.xsltc.trax. TransformerImpl.transformIdentity(TransformerImpl.java:636) в com.sun.org.apache.xalan.internal.xsltc.trax. TransformerImpl.transform(TransformerImpl.java:707)... Еще 30

Это появляется, той пружиной пропускает возможное исключение здесь и не переносит его, но такое основное состояние ошибки, не будучи пойманным кажется маловероятным мне. Кто-либо может помочь мне найти корень этой проблемы?

Я буду включать web.xml и servlet.xml также:

web.xml:



    
        ws
        org.springframework.ws.transport.http.MessageDispatcherServlet
        1
        
            transformWsdlLocations
            true
        
    
    
        ws
        /*
    

контекст сервлета:


    

    
    
        
    
    
        
            
                classpath:mapping.xml
                classpath:hoursOfOperationMapping.xml
            
        
    

    
        
        
        
        
    

    

    
        
    

6
задан walnutmon 9 August 2010 в 14:45
поделиться

3 ответа

Я более внимательно изучил ваш вопрос и думаю, что знаю, что происходит. Обработчик исключений не вызывается, потому что он находится на более высоком уровне обработки мыла. Видите ли, WebServiceMessageReceiverHandlerAdapter пытается декодировать входящую строку в XML перед отправкой ее маршаллеру для обработки. Поскольку XML недействителен, вызов не выполняется. А поскольку WebServiceMessageReceiverHandlerAdapter не поддерживает обработчик исключений, он просто повторно генерирует исключение SaajSoapMessageException.

Теперь вы можете создать новый класс, расширяющий WebServiceMessageReceiverHandlerAdapter, но также включающий handleConnection () в метод try / catch, который использует ваш обработчик исключений при возникновении исключения.


Между прочим, при отладке такого рода проблем мой подход состоит в том, чтобы вывести в log4j как имя метода, так и номер строки. А также скачивание исходников Spring.

4
ответ дан 8 December 2019 в 17:17
поделиться

Я помню, как столкнулся с подобной проблемой при работе с spring-security. У меня также были проблемы с тем, что мой преобразователь исключений не вызывался при некоторых условиях.

Проблема заключалась в том, что существует цепочка фильтров, которая обрабатывает каждый запрос. Код, вызывающий распознаватель исключений, является фильтром в этой цепочке, но он находится ближе к концу цепочки. Следовательно, если исключение возникало где-то внутри фильтров до фильтра, вызывающего преобразователь исключений, мой преобразователь никогда бы не был вызван.

Я предполагаю, что вы страдаете от чего-то подобного, когда ошибки разбора конверта происходят до фильтра вызова resolver исключений. Если это так, вам придется прибегнуть к какому-то другому способу обработки этих исключений, например, к ванильному фильтру сервлетов.

1
ответ дан 8 December 2019 в 17:17
поделиться

Вы должны «подключить» (или «внедрить») обработчик исключений в ваши Spring beans. Я не уверен, какой из ваших компонентов Spring действительно нуждается в обработчике исключений.

Лично я использую default-autowire = "byName" , в результате чего мой exceptionHandler автоматически подключается к моему классу контроллера. Ваш подход фактически использует ручную проводку. Итак, вам нужно выяснить, какой bean-компонент действительно должен использовать обработчик исключений. Вы пробовали (прямо в голове):

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

Или вы могли бы просто добавить механизм Spring с автоматическим подключением и позволить ему автоматически подключать компоненты. :)

-1
ответ дан 8 December 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: