我有一个SOAP服务,如果我为XML元素指定了错误的输入,请求和响应按预期工作,输入良好
在请求正文中:
...
<ns:myIntegerElement>asdf</ns:myIntegerElement>
...
Run Code Online (Sandbox Code Playgroud)
我的异常解析器被调用,这个解析器只是异常解析器的一个实现,因此它没有异常映射,只是抽象方法中的一些System.out
<bean id="exceptionResolver" class="com.mycompany.ws.MyExceptionResolver">
Run Code Online (Sandbox Code Playgroud)
但是,如果我发送的请求看起来更像这样:
...
<ns:myIntegSOMETHINGGOTTOTALLYMESSUP!!!ent>asdf</ns:myIntegerElement>
...
Run Code Online (Sandbox Code Playgroud)
我的解析器根本没有执行
我将log4j设置为具有根调试级别并查看此输出:
2010-08-09 10:30:01,900 [主题:http-8080-2] DEBUG [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 [主题:http-8080-2] DEBUG [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)at org .springframework.ws.soap.saaj.SaajSoapMessage.getImplementation(SaajSoapMessage.java:251)org.springframework.ws.soap.saaj.SaajSoapMessage.(SaajSoapMessage.java:位于org.springframework.ws.soap.saaj.support.SaajUtils.getSaajVersion的com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:122)中的createEnvelopeFromSource(SOAPPart1_1Impl.java:70)( 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.java:719)的com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl. java:313)在com.sun.xml的com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:393).internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:102)... 27更多引起:org.xml.sax.SAXParseException:元素类型"smm:smm-aid"必须由匹配终止结束标记"".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)在com的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"必须由匹配的结束标记""终止.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)在com的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"必须由匹配的结束标记""终止.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)在com的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"必须由匹配的结束标记""终止.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)在com的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"必须由匹配的结束标记""终止.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: …
默认情况下,当RuntimeException在我的服务器上发生扩展的未捕获异常时,JAX-WS会构建以下SOAP错误消息:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>[runtime exception message here]</faultstring>
<detail>
<ns2:exception class="java.lang.RuntimeException" note="To disable this feature, set com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false" xmlns:ns2="http://jax-ws.dev.java.net/">
<message>[runtime exception message here too]</message>
<ns2:stackTrace>
[stack trace details]
</ns2:stackTrace>
</ns2:exception>
</detail>
</S:Fault>
</S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)
哪种有意义,除了我想改变那种行为以便发送它:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>Something wrong happened and it's totally our fault</faultstring>
</S:Fault>
</S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)
请注意,消息不应该是RuntimeException的消息内容,而是针对可能在服务器端进行扩展的任何异常的自定义静态消息.RuntimeException
我无法更改WSDL,我不想设置自定义异常.
我正在使用spring插件: com.sun.xml.ws.transport.http.servlet.WSSpringServlet
我怎样才能做到这一点?
任何人都可以告诉我为什么我不能用我的解析器捕获常规Java异常,所以我可以在回复响应之前对其进行转换?它永远不会被断点击中.如果不可能,我该怎么办?
SoapFaultMappingExceptionResolver
public class LisSoapFaultTranslatorExceptionResolver extends SoapFaultMappingExceptionResolver {
@Override
protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
SoapFaultDetail detail = fault.addFaultDetail();
}
}
Run Code Online (Sandbox Code Playgroud)
豆
<sws:annotation-driven />
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" />
<bean id="exceptionResolver"
class="com.openclass.adapter.ws.resolvers.LisSoapFaultTranslatorExceptionResolver">
<property name="defaultFault" value="RECEIVER,Server error">
</property>
<property name="exceptionMappings">
<value>java.lang.Exception=SERVER,FaultMsg</value>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
有错误的肥皂反应
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring xml:lang="en">java.lang.NullPointerException</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
网络服务
@PayloadRoot(localPart="readCourseSectionRequest", namespace="http://www.imsglobal.org/services/lis/cmsv1p0/wsdl11/sync/imscms_v1p0")
@ResponsePayload
public ReadCourseSectionResponse readCourseSection(@RequestPayload ReadCourseSectionRequest request, MessageContext messageContext) {
// Throws error since courseService is null
ReadCourseSectionResponse openClassResponse = courseService.readCourseSection(request);
return new …Run Code Online (Sandbox Code Playgroud)