解组 SOAP 故障 JAXB

Unmarshall SOAP fault JAXB

我需要帮助来使用 JAXB 解组 SOAP 响应 java class

 <soapenv:Fault>
      <faultcode>soapenv:Server</faultcode>
      <faultstring>DLResponseException</faultstring>
      <detail>...
     ....

我创建了一个 java class 根元素如下

@XmlRootElement(name="Fault", namespace="http://schemas.xmlsoap.org/soap/envelope/")
public class MFaultResponse{
..
}

用法:

 InputStream is = new ByteArrayInputStream(sample.getBytes());

    JAXBContext jaxbContext = JAXBContext.newInstance(MFaultResponse.class);  
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  

    MFaultResponse response= (MFaultResponse) jaxbUnmarshaller.unmarshal(is);
    System.out.println(response.getFaultCode());

异常:

原因:org.xml.sax.SAXParseException;行号:1;列数:16;元素 "soapenv:Fault" 的前缀 "soapenv" 未绑定。

问题与 Spring 集成无关,与 Spring 完全无关。

这是典型的 JAXB 情况,当您有一个 xml 片段时。我知道这是 SOAP 响应的主体,但正如您所见,soapenv 的真正名称空间是在 SOAP 信封的根部声明的。

如果您没有该前缀,您可以解组文档,但由于它是关于一个片段,而不是整个 SOAP 响应,我建议执行手动 XPath 来提取这 3 个标签的值并手动构建这样的 MFaultResponse

不过不确定,为什么 Spring WS 中的标准 SoapFault 方法不适合你..