假设我在文件中有以下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.

}

09-27 02:46