1

我正在通过 jax ws 客户端代码(从 wsdl 生成)调用一个肥皂网络服务。但是该服务使用“Content-Type:text/html”发送响应,因为 jax-ws 实现需要“text/xml”类型。Web 服务人员不会更改响应标头。

例外是:

com.sun.xml.internal.ws.client.ClientTransportException:服务器发送 HTTP 状态代码 200:在 com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:266) 处确定~[?:1.8.0_171] 在 com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:217) ~[?:1.8.0_171] 在 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 标头为 text/xml。这是 saaj 的例外情况:

原因:com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl:无效的内容类型:文本/html。这是错误消息而不是 SOAP 响应吗?在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 在 com.sun.xml.internal.messaging.saaj.soap.MessageImpl.identifyContentType(MessageImpl.java:655) ~[?:1.8. 0_171] 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process (AbstractProtocol.java:790) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49 )

有没有办法让 jaxws 忽略响应头并继续解析?

4

1 回答 1

1

没有完全找到 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");
        }
    });
于 2018-06-14T18:04:30.743 回答