当前位置: 首页 > 面试题库 >

Spring Web Services-跳过ExceptionResolver的异常

许博达
2023-03-14
问题内容

我有一个SOAP服务,如果我为XML元素指定了错误的输入,则请求和响应可以按预期的方式在良好的输入下工作

在请求正文中:

...
<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]调试[org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter]-接受传入的[org.springframework.ws.transport.http.HttpServletConnection@c46dcf
]到 [http:// localhost:8080 / myws / MyWebServices
/] 错误:“元素类型“
ns:MESSEDUPELEMENT”必须由匹配的结束标记“”终止。” 2010-08-09 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.org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion(SaajUtils.java:162)
org.springframework.ws.soap.saaj.SaajSoapMessage。(SaajSoapMessage.java:上的.springframework.ws.soap.saaj.SaajSoapMessage.getImplementation(SaajSoapMessage.java:251)com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:122)上的createEnvelopeFromSource(SOAPPart1_1Impl.java:70)在org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion(
SaajUtils.java:159)…还有24个原因:javax.xml.transform.TransformerException:org.xml.sax.SAXParseException:元素类型“
smm:smm-aid”必须由匹配的结束标记“
”。在com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:719)
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-
aid”必须通过匹配终止结束标记“”。在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),位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636)的org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333)
.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707)…还有30个
createEnvelope(EnvelopeFactory.java:102)…还有27个原因:org.xml.sax.SAXParseException:元素类型“
smm:smm-
aid”必须由匹配的结束标记“”终止。在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),位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636)的org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333)
.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707)…还有30个
createEnvelope(EnvelopeFactory.java:102)…还有27个原因:org.xml.sax.SAXParseException:元素类型“
smm:smm-
aid”必须由匹配的结束标记“”终止。在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),位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636)的org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333)
.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707)…还有30个
元素类型“ smm:smm-
aid”必须由匹配的结束标记“”终止。在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),位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636)的org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333)
.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707)…还有30个
元素类型“ smm:smm-
aid”必须由匹配的结束标记“”终止。在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),位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:636)的org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333)
.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:707)…还有30个

似乎spring在这里缺少可能的异常,并且没有包装它,但是对于我来说,这样的基本错误情况似乎没有被抓住。谁能帮助我找到这个问题的根源?

我还将包括web.xml和servlet.xml:

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>

servlet上下文:

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

问题答案:

我已经仔细研究了您的问题,我认为我知道发生了什么事。未调用您的异常处理程序,因为它在肥皂处理中处于较高级别。您会看到,WebServiceMessageReceiverHandlerAdapter尝试将传入的字符串解码为XML,然后再将其发送到编组器进行处理。由于XML无效,因此调用失败。并且由于WebServiceMessageReceiverHandlerAdapter不支持异常处理程序,因此它仅引发异常“
SaajSoapMessageException”。

现在,您可以做的是创建一个扩展WebServiceMessageReceiverHandlerAdapter的新类,但该类还将handleConnection()封装在try
/ catch中,该异常在引发异常时使用异常处理程序。

顺便说一句,调试此类问题时,我的方法是在log4j中同时输出方法名称和行号。以及下载Spring源码。



 类似资料:
  • 问题内容: 如果发生某些异常,我试图使工作没有。 这些文档讨论的是在内部使用,但是如何在内部使用呢?以下代码不起作用: 问题答案: 正如Michael Minella建议的那样,我在Tasklet中实现了此功能: 以Spring XML配置为例:

  • 我尝试了在这里和其他地方找到的多个例子,但它总是无法满足我的需要。 我的R脚本只是一个配置验证脚本,它会检查以确保用户的环境设置正确。因此,我想尝试5个不同的步骤,并报告每个步骤的状态,以便用户可以立即修复所有问题。例如,我的第一步测试与数据库的连接,如果失败,我想打印一条消息并继续执行步骤2。但它总是在出错时停止执行,所以我只会遇到失败,然后就再也没有了。 我正在使用RScript从命令行运行脚

  • 我正在使用Spring 4.0.5和Spring Batch 3.0.1 我有这样一个简单的步骤,它工作的很完美: 我尝试了一个简单的跳过限制示例(配置跳过逻辑),如下所示: 任何帮助都非常感谢。谢谢

  • 函数recursive 是异步加递归 理想状态是:在函数updateParams调用 await函数recursive执行完后再执行后面代码。 实际:函数recursive还没执行完后面的代码就执行了

  • 本文向大家介绍C#跳过而,包括了C#跳过而的使用技巧和注意事项,需要的朋友参考一下 示例 SkipWhile() 用于排除元素,直到第一个不匹配为止(这对大多数人来说可能很直观)