【问题标题】:jaxws handler behavior on faulty responsesjaxws 处理程序对错误响应的行为
【发布时间】:2011-12-12 17:26:31
【问题描述】:

我已经设置了一个 JAXWS 客户端并将一个 SoapHandler 实现添加到它的 Binding handlerChain。所有这些都是为了在它没有正常运行时查看原始服务响应。

当一切正常时,我的 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().getSOAPPart() 中有一个不错的 XML,我不认为这是要走的路。

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

我真的应该走那条路吗?

【问题讨论】:

    标签: java jax-ws handler


    【解决方案1】:

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

    为了获取数据流,您需要在 HTTP(或其他)协议管道中插入某种处理程序。我确信有一些方法可以根据您的 JAX-WS 实现和版本来完成此操作,但没有一种方法是 JAX-WS 标准的一部分。 (再次,AFAIK..)

    如果您只是需要解决问题并且真的只想记录来自 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。如in the answer to this question 所述,dump=true(注意额外的“内部”)。
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2017-05-25
    • 2011-09-09
    相关资源
    最近更新 更多