【问题标题】:How to unmarshal SoapFault from raw xml payload from a file?如何从文件中的原始 xml 有效负载中解组 SoapFault?
【发布时间】:2016-11-08 18:08:23
【问题描述】:

假设我在一个文件中有以下 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。(即在对目标服务器进行 Web 服务调用并返回有效响应之后)

如果目标服务器返回 SoapFault,像上面这样的 SoapFault 会被转储到文件系统。

当模拟器切换到播放模式时,从转储中解组的匹配响应返回到服务器(使用 JAXB.unmarshall() 完成)

这工作正常,但模拟器目前无法解组 SoapFault(和相应的 CheckedException )并将其作为异常抛出。

【问题讨论】:

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


    【解决方案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.
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2021-03-29
      • 2017-02-08
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      相关资源
      最近更新 更多