createFault的faultCode参数传递为NULL - 使用Metro 2.3

时间:2015-03-16 10:06:09

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

我正在使用Metro 2.3并使用JAX-WS调用webservice请求。 作为其中一个流程的一部分,我们正在获取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>

基本上我删除了,&#34; SOAP-ENV&#34;来自&#34; faultcode&#34;和&#34; faultstring&#34; xml标签。我是这个XML部分的新手,发现这里的问题真的很难。 我甚至经历了这个链接reg。 faultResponse规范。 http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383510。但我仍然不是很清楚,因为我是新手。 这个响应来自第三方系统。这是因为回应不是对标准的投诉吗?你能帮我找一下这种行为的原因吗?

1 个答案:

答案 0 :(得分:2)

确定。我在完成SOAP Fault代码模式后找到了原因。 http://schemas.xmlsoap.org/soap/envelope/

根据这个,名称空间不应该以&#34; faultcode&#34;为前缀。和&#34; faultstring&#34;。

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

而标签如&#34;故障&#34;应该以名称空间

作为前缀
<xs:element name="Fault" type="tns:Fault"/>