【发布时间】:2012-08-23 21:21:58
【问题描述】:
我使用 AXIS2 创建的 ADB 存根访问 SOAP 服务。我想记录服务返回的任何 Axis Fault 的原始 XML 响应。我可以将这些错误捕获为“ServiceError”。但是,我没有找到检索原始 XML 的方法(参见下面的示例)。
我找到了一种使用 getOMElement 访问原始 XML 请求/响应以进行常规处理的方法(参见下面的示例)。但是,这不适用于故障。
如何使用 ADB 存根获取原始 XML 错误?
示例 Java 代码:
public void testRequest(String URL) throws AxisFault {
MyServiceStub myservice = new MyServiceStub(URL);
MyRequest req = new MyRequest();
try {
TypeMyFunctionResponse response = myservice.myFunction(req);
// logging full soap response
System.out.println("SOAP Response: "
+ response.getOMElement(null,
OMAbstractFactory.getOMFactory())
.toStringWithConsume());
} catch (RemoteException e) {
//...
} catch (ServiceError e) {
// how to get the raw xml?
}
}
我想获取并记录的故障响应示例:
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<soapenv:Fault>
<soapenv:Code>
<soapenv:Value>soapenv:Receiver</soapenv:Value>
</soapenv:Code>
<soapenv:Reason>
<soapenv:Text xml:lang="en-US">service error</soapenv:Text>
</soapenv:Reason>
<soapenv:Detail>
<ns1:error xmlns:ns1="http://www.somehost.com/webservices/someservice">
<ns1:code>500</ns1:code>
<ns1:messageText>some fault message</ns1:messageText>
</ns1:error>
</soapenv:Detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
【问题讨论】:
-
这可能不是您想要的,但是编写一个 JAX-WS 处理程序来记录故障呢?使用处理程序,您可以访问 SOAP 消息。例如:mkyong.com/webservices/jax-ws/…
-
谢谢!这可能是解决方案。但是,我需要进行相当大的代码更改并用 JAX-WS 替换 AXIS2。因此,如果有任何方法可以通过保持当前框架以更少的努力解决这个问题,我会非常高兴。
-
一些澄清:您不需要用 JAX-WS “替换” Axis2。 JAX-WS 是 Java Web 服务(@WebService 注释等)的规范,Axis2 是它的实现之一。 jdk 包含 JAX-WS 的参考实现,您也可以单独使用它,但 Axis2 是一个替代方案。不过,您应该能够在当前设置旁边使用处理程序(因为 Axis2 实现了 JAX-WS)。
-
我现在按照你的建议做了。以前我的cmets不够精确。我不得不用 JAX-WS (wsimport) 生成的客户端替换我的 AXIS2-ADB-stubs。但是,这并没有我预期的那么耗时。我现在也将删除 AXIS2。在我看来,无论我使用 jdk-reference 实现还是 AXIS2,都没有太大区别。
-
只要您不需要任何花哨的标准,例如 WS-Security,它并没有真正的不同。很高兴听到我的建议很有用。如果这是解决方案,那么演示记录 SOAP 错误的处理程序的答案将是合适的。你提供,还是我应该提供?