如何从文件的原始xml有效负载解组SoapFault?

时间:2016-07-06 15:49:10

标签: java web-services soap jaxb jax-ws

假设我在文件中有以下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)并将其作为异常抛出。

1 个答案:

答案 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.

}