假设我在文件中有以下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)并将其作为异常抛出。
答案 0 :(得分:1)
请试试这个,
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.
}