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



我正在使用Metro 2.3并使用JAX-WS调用Web服务请求。作为其中一个流的一部分,我们得到了 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>

基本上,我从"错误代码"和"错误字符串"xml标签中删除了"SOAP-ENV"。我是这个XML部分的新手,发现这里真正的问题是什么很困难。我什至已经浏览了这个链接注册错误响应规范 http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383510。但我仍然不是很清楚,因为我是新手。这个回复来自第三方系统。是不是回应不是投诉标准?你能帮我找到这种行为的原因吗?

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

因此,名称空间不应为"错误代码"和"错误字符串"添加前缀。

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

而像"Fault"这样的标签应该以命名空间为前缀

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

最新更新