Web services 使用简单Camel代理传播SOAPFault
我正在尝试使用Switchyard 1.1和Camel创建一个简单的WS-proxy: -->PromotedService-->驼峰-->代理服务 使用当前的配置,我能够发送和接收消息,没有任何问题。 但是,当ProxifiedService抛出SoapFault时,它不会传播到PromotedService的调用方 如何确保PromotedServiceCaller接收到SOAPFault作为响应 这就是我迄今为止所尝试的:Web services 使用简单Camel代理传播SOAPFault,web-services,soap,apache-camel,Web Services,Soap,Apache Camel,我正在尝试使用Switchyard 1.1和Camel创建一个简单的WS-proxy: -->PromotedService-->驼峰-->代理服务 使用当前的配置,我能够发送和接收消息,没有任何问题。 但是,当ProxifiedService抛出SoapFault时,它不会传播到PromotedService的调用方 如何确保PromotedServiceCaller接收到SOAPFault作为响应 这就是我迄今为止所尝试的: onException(Exception.class)
onException(Exception.class)
.process(
new Processor() {
public void process(Exchange exchange) throws Exception {
SoapFault fault = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, SoapFault.class);
System.out.println("Fault: " + fault); // --> This returns NULL
Exception excep = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
System.out.println("excep: " + excep);
System.out.println("excep message: " + excep.getMessage());
System.out.println("excep cause: " + excep.getCause());
SoapFault SOAP_FAULT = new SoapFault(excep.getMessage(), SoapFault.FAULT_CODE_CLIENT);
Element detail = SOAP_FAULT.getOrCreateDetail();
Document doc = detail.getOwnerDocument();
Text tn = doc.createTextNode("this is a test");
detail.appendChild(tn);
exchange.getOut().setFault(true);
exchange.getOut().setBody(SOAP_FAULT);
exchange.setProperty(Exchange.ERRORHANDLER_HANDLED, false);
exchange.removeProperty("CamelExceptionCaught");
}
})
.handled(true)
.end();
from("switchyard://PromotedService")
.process(myProc) // --> I just add some headers here to the original request.
.handleFault()
.to("switchyard://ProxifiedService").end();
这是ProxifiedService生成的SOAPFault:
<soapenv:Envelope xmlns:ser="http://service.admin.ws.my.company/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Missing valid token.</faultstring>
</soapenv:Fault>
</soapenv:Body>
soapenv:服务器
缺少有效令牌。
这是呼叫者真正收到的信息:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>org.switchyard.HandlerException: org.apache.cxf.binding.soap.SoapFault: javax.xml.transform.dom.DOMSource@663dcb96</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
soap:服务器
org.switchyard.HandlerException:org.apache.cxf.binding.soap.SoapFault:javax.xml.transform.dom。DOMSource@663dcb96
谢谢大家! onException()只接受抛弃。在代码中,参数是SoapFault,不能丢弃
这会奏效的
onException(SOAPException.class)
我尝试使用SOAPException,但该方法仍然没有执行。但是,如果我使用“onException(Exception.class)”,它将被执行,但我不知道如何将原始SOAPFault重定向到调用方。我已编辑原始帖子,以包含应传播到原始调用方的stacktrace和SOAPFault消息。cxfEndPoint拦截器以相同的方式处理SOAPMessage和SOAPFault,因此只需构造SOAPFault end send in响应体。请参考链接,谢谢!我能够抛出一个自定义错误。但是,我试图获取ProxifiedService抛出的原始错误消息,但获取的异常文本是字符串“javax.xml.transform.dom”。DOMSource@136bd而不是“缺少有效令牌”。我用我现在在process方法中使用的代码更新问题。为什么我会收到关于DOM的奇怪信息?再次感谢你的帮助。