createFault 的 faultCode 参数被传递 NULL -with Metro 2.3

faultCode argument for createFault was passed NULL -with Metro 2.3

我正在使用 Metro 2.3 并使用 JAX-WS 调用网络服务请求。 作为其中一个流程的一部分,我们得到了 faultResponse,但是在处理它时我得到了以下异常

java.lang.IllegalArgumentException: faultCode argument for createFault was passed NULL
   at com.sun.xml.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl.createFault(SOAPFactory1_1Impl.java:68)
   at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:184)
   at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:125)
   at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253)
   at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:181)
   at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:258)
   at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:117)
   at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:91)
   at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:154)...

来自 tcpdump,这是我们得到的响应,

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:faultcode>SOAP-ENV:Client</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Not logged in. Request rejected</SOAP-ENV:faultstring>
<SOAP-ENV:detail>
<res:Error xmlns:res="http://www.xtcplus.com/soap/schemas/requests/fault/tfcsoap-fault">
<ErrorNo>30001</ErrorNo>
<TextID>10022</TextID>
<Text>Not logged in. Request rejected</Text>
<Level>5</Level>
<SubsystemID>0</SubsystemID>
</res:Error>
</SOAP-ENV:detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我浏览了其他论坛,怀疑这可能是一些命名空间问题。所以。我只是模拟了 SOAP UI 对不同组合的响应,下面的响应工作正常。系统能够正确解析并显示错误响应。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>Client</faultcode>
<faultstring>Not logged in. Request rejected</faultstring>
<SOAP-ENV:detail>
<res:Error xmlns:res="http://www.xtcplus.com/soap/schemas/requests/fault/tfcsoap-fault">
<ErrorNo>30001</ErrorNo>
<TextID>10022</TextID>
<Text>Not logged in. Request rejected</Text>
<Level>5</Level>
<SubsystemID>0</SubsystemID>
</res:Error>
</SOAP-ENV:detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

基本上我从 "faultcode" 和 "faultstring" xml 标签中删除了 "SOAP-ENV"。我是这个 XML 部分的新手,发现很难解决这里真正的问题。 我什至经历了这个 link reg。故障响应规范http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383510。但是我还是不太清楚,因为我是新手。 这个响应来自第 3 方系统。难道回复不符合标准?你能帮我找到这种行为的原因吗?

好的。通过 SOAP 错误代码模式后,我找到了原因。 http://schemas.xmlsoap.org/soap/envelope/

据此,名称 space 不应作为 "faultcode" 和 "faultstring" 的前缀。

<xs:element name="faultcode" type="xs:QName"/>
<xs:element name="faultstring" type="xs:string"/>

而像 "Fault" 这样的标签应该以名称为前缀 space

<xs:element name="Fault" type="tns:Fault"/>