Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误响应上的jaxws处理程序行为_Java_Jax Ws_Handler - Fatal编程技术网

Java 错误响应上的jaxws处理程序行为

Java 错误响应上的jaxws处理程序行为,java,jax-ws,handler,Java,Jax Ws,Handler,我已经设置了一个JAXWS客户机,并在其绑定handlerChain中添加了一个SoapHandler实现。所有这些都是为了在原始服务响应没有正常运行时查看它 当一切正常时,我的handler.handleMessage()会被调用两次,一次用于请求,一次用于响应 但是当服务的响应是一些混乱的XML或更糟的时候,我希望调用handler.handleFault,但什么也没有发生 以下是本例中相关stacktrace的一部分: com.sun.xml.internal.ws.streaming.X

我已经设置了一个JAXWS客户机,并在其绑定handlerChain中添加了一个SoapHandler实现。所有这些都是为了在原始服务响应没有正常运行时查看它

当一切正常时,我的handler.handleMessage()会被调用两次,一次用于请求,一次用于响应

但是当服务的响应是一些混乱的XML或更糟的时候,我希望调用handler.handleFault,但什么也没有发生

以下是本例中相关stacktrace的一部分:

com.sun.xml.internal.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Premature end of file.
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.wrapException(XMLStreamReaderUtil.java:256)
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.next(XMLStreamReaderUtil.java:84)
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextContent(XMLStreamReaderUtil.java:99)
    com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:89)
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:164)
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:292)
    com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:118)
    com.sun.xml.internal.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:278)
    com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:180)
    com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)
    com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)
    com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587)
    com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546)
    com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531)
    com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428)
    com.sun.xml.internal.ws.client.Stub.process(Stub.java:211)
    com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124)
    com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
    com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
我希望获得交换的原始数据,这些数据可能不是XML,而且由于我的处理程序已经期望在其上下文中有一个很好的XML。getMessage().getSOAPPart(),我认为这不是解决问题的方法

我很想绕过SOAP堆栈,直接通过HTTP运行请求来获取数据,但我觉得这有点难看


我真的应该走那条路吗

AFAIK,无法通过编程方式获取JAX-WS服务的原始数据流

为了获得数据流,您需要在HTTP(或其他)协议管道中插入某种处理程序。我确信,根据您的JAX-WS实现和版本,有一些方法可以实现这一点,但没有一种方法是JAX-WS标准的一部分。(再说一遍,阿福…)

如果您只是需要对问题进行故障排除,并且确实只想记录来自HTTP管道的请求和响应,则可以使用此系统属性使HTTP传输管道记录流经它的所有内容:

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

这也是解决问题的一个好方法——尽管它假定您可以准确地重新创建代码发送的请求。。如果您没有代码在某处实际生成的日志,那么您将很难再现由应用程序错误输入引起的问题。在我的情况下,这是可行的,因为存在一些“默认查询”,我可以轻松使用它们查看远程端是否正常工作。如果您使用内部JAX-WS,例如,与rt.jar中的JRE一起提供的,您必须使用com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true(注意额外的“internal”)。