将肥皂体中发现的肥皂缺陷移到Spring网络服务中发现的响应的肥皂头的最佳方法是什么?那里有什么例子吗?
我可以拦截错误,但我不认为我可以用这个解析器修改任何东西。
public class LisSoapFaultTranslatorExceptionResolver extends SoapFaultMappingExceptionResolver {
@Override
protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
fault = null;
}
}
答案 0 :(得分:2)
来自W3Schools,
可选的SOAP Fault元素用于指示错误消息。
如果存在Fault元素,它必须显示为Body元素的子元素。 Fault元素只能在SOAP消息中出现一次。
如果您的SOAP错误位于响应的头部,则SOAP信封不再符合规范。你不应该这样做。我怀疑实现SOAP接口的框架甚至可以让你这样做。
要被识别为携带SOAP错误信息,SOAP消息必须包含单个SOAP Fault元素信息项作为SOAP Body的唯一子元素信息项。
来自Spec
被识别为携带SOAP错误信息,SOAP消息 必须包含一个SOAP Fault元素信息项作为唯一 SOAP Body的子元素信息项。
生成错误时,SOAP发件人不得包含其他内容 SOAP Body中的元素信息项。一条消息,其身体 包含一个错误加上额外的元素信息项没有 SOAP定义的语义。
SOAP Fault元素信息项可能出现在SOAP标头中 阻止,或作为子元素信息项的后代 SOAP Body;在这种情况下,该元素没有SOAP定义的语义。
如果您这样做,重要的部分是the element has no SOAP-defined semantics
。我想你自己就是这个。如果没有错误,可以使用Spring生成SOAP响应,否则自己生成它。
答案 1 :(得分:1)
我可以通过向标题添加项目来实现这一点。
Spring配置文件:
<sws:interceptors>
<sws:payloadRoot
namespaceUri="http://www.imsglobal.org/services/lis/cmsv1p0/wsdl11/sync/imscms_v1p0">
<bean class="com.openclass.adapter.interceptors.LisResponseInterceptor"/>
</sws:payloadRoot>
</sws:interceptors>
Java代码:
public class LisResponseInterceptor extends EndpointInterceptorAdapter {
@Override
public boolean handleResponse(MessageContext messageContext, Object endpoint{
return true;
}
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint){
return true;
}
@Override
public boolean handleFault(MessageContext messageContext, Object endpoint){
SoapMessage response = (SoapMessage) messageContext.getResponse();
SoapHeader header = response.getSoapHeader();
header.addHeaderElement(new QName("ims","imsx_syncRequestHeaderInfo"));
return true;
}
}