如何在不检查 Content-Type header 的情况下使 jaxws 解析响应
How can I make jaxws parse response without checking Content-Type header
我正在通过 jax ws 客户端代码(从 wsdl 生成)调用 soap 网络服务。
但是该服务发送带有 "Content-Type:text/html" 的响应,其中 jax-ws 实现需要 "text/xml" 类型。
网络服务人员不会更改响应 header.
例外情况是:
com.sun.xml.internal.ws.client.ClientTransportException: The server
sent HTTP status code 200: OK at
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:266)
~[?:1.8.0_171] at
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:217)
~[?:1.8.0_171] at
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:130)
~[?:1.8.0_171] at
com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:124)
~[?:1.8.0_171]
还尝试了 Saaj 实施。它还要求响应 Content-Type header 为 text/xml。
这是 saaj 的例外情况:
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl:
Invalid Content-Type:text/html. Is this an error message instead of a
SOAP response? at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at
com.sun.xml.internal.messaging.saaj.soap.MessageImpl.identifyContentType(MessageImpl.java:655)
~[?:1.8.0_171] at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
有没有办法让 jaxws 忽略响应 header 并继续解析?
没有完全找到 jax-ws 的解决方案,但感谢@JGlass 找到了一个非常简单的 apache cfx 解决方案。非常灵活的 jax-ws 实现。爱上它了。
这是使其工作的简单代码:
Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new AbstractPhaseInterceptor<org.apache.cxf.message.Message>(Phase.RECEIVE) {
public void handleMessage(org.apache.cxf.message.Message message) {
message.put(org.apache.cxf.message.Message.CONTENT_TYPE, "text/xml");
}
});
我正在通过 jax ws 客户端代码(从 wsdl 生成)调用 soap 网络服务。 但是该服务发送带有 "Content-Type:text/html" 的响应,其中 jax-ws 实现需要 "text/xml" 类型。 网络服务人员不会更改响应 header.
例外情况是:
com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 200: OK at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:266) ~[?:1.8.0_171] at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:217) ~[?:1.8.0_171] at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:130) ~[?:1.8.0_171] at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:124) ~[?:1.8.0_171]
还尝试了 Saaj 实施。它还要求响应 Content-Type header 为 text/xml。 这是 saaj 的例外情况:
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:text/html. Is this an error message instead of a SOAP response? at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.identifyContentType(MessageImpl.java:655) ~[?:1.8.0_171] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
有没有办法让 jaxws 忽略响应 header 并继续解析?
没有完全找到 jax-ws 的解决方案,但感谢@JGlass 找到了一个非常简单的 apache cfx 解决方案。非常灵活的 jax-ws 实现。爱上它了。 这是使其工作的简单代码:
Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new AbstractPhaseInterceptor<org.apache.cxf.message.Message>(Phase.RECEIVE) {
public void handleMessage(org.apache.cxf.message.Message message) {
message.put(org.apache.cxf.message.Message.CONTENT_TYPE, "text/xml");
}
});