假设我在文件中有以下xml负载
<?xml version="1.0" encoding="UTF-8"?>
<ns2:Fault
xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>ns2:Server</faultcode>
<faultstring>some Error</faultstring>
<detail>
<ns4:ApplicationSOAPFault xmlns:ns4="http://application.exception">
<code>04</code>
<message>SimiError</message>
</ns4:ApplicationSOAPFault>
</detail>
</ns2:Fault>
如何将其解组为SoapFault(和CheckedException,如果可用)并将其作为异常抛出?
背景
我们正在尝试构建一个模拟器,该模拟器在记录/代理模式期间使用LogicalHandler将WebService请求和响应有效负载xml转储到FileSystem。(即在对目标服务器进行Webservice调用并获得有效响应后)
如果目标服务器返回Soap Fault,则将上述SoapFault转储到文件系统中。
当模拟器切换到播放模式时,将从转储解组的匹配响应返回服务器(使用JAXB.unmarshall()完成)
这可以正常工作,但是模拟器当前无法解组SoapFault(和相应的CheckedException)并将其作为Exception抛出。
最佳答案
请尝试一下
final SOAPMessage msg = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL)
.createMessage(new MimeHeaders(), new ByteArrayInputStream(yourSoapMessageWithFault.getBytes()));
if (msg != null) {
SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
SOAPBody body = env.getBody();
if (body != null && body.hasFault()) {
final SOAPFault fault = body.getFault();
final DetailEntry entry = (DetailEntry)fault.getDetail().getDetailEntries().next();
//now UNMarshall this entry to your custom exception class.
}