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

时间:2011-10-21 16:11:50

标签: java jax-ws handler

我已经设置了一个JAXWS客户端,并在其Binding handlerChain中添加了一个SoapHandler实现。所有这些都希望在原始服务响应没有按预期运行时查看。

当一切都很好时,我的handler.handleMessage()会被调用两次,一次是请求,一次是响应。

但是当服务的响应是一些乱码XML或更糟糕的时候我希望调用handler.handleFault但没有任何反应。

在这种情况下,这是相关堆栈跟踪的一部分:

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的RAW数据,因为我的处理程序已经在它的context.getMessage()中期望一个很好的XML .getSOAPPart()我不认为这是要走的路。

我很想绕过SOAP堆栈并直接通过HTTP运行我的请求来获取数据,但发现这有点丑陋

我真的应该那样走吗?

1 个答案:

答案 0 :(得分:2)

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

为了获取数据流,您需要在HTTP(或其他)协议管道中插入某种处理程序。我确信有很多方法可以实现这一点,具体取决于您的JAX-WS实现和版本,但没有一个是JAX-WS标准的一部分。 (再次,AFAIK ..)

如果您只是需要解决问题,并且只是想从HTTP管道记录请求和响应,您可以使用此系统属性使HTTP传输管道记录流经它的所有内容:

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