【问题标题】:How can I make jaxws parse response without checking Content-Type header如何在不检查 Content-Type 标头的情况下进行 jaxws 解析响应
【发布时间】:2018-11-23 07:31:06
【问题描述】:

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

例外是:

com.sun.xml.internal.ws.client.ClientTransportException:服务器 发送 HTTP 状态码 200: OK at 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] 在 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 忽略响应头并继续解析?

【问题讨论】:

  • 您在什么类型的应用服务器上运行,版本是什么?例如。 websphere、glassfish、JBoss 还是 Tomcat?
  • 带有嵌入式 tomcat 的弹簧启动。我无法解析来自我在代码中调用的 Web 服务的响应,因为它返回了错误的肥皂内容类型:test/html
  • tomcat 版本是多少?
  • 您应该能够使用 CXF 拦截器或 JAX-WS 处理程序,尽管我知道您的需求过于复杂,但可能是您唯一的选择 how do i modify http headers for a jax-ws response in cxf 如果您采用 JAX-WS 路线,我还有更多目前在项目中使用它的经验!
  • 谢谢@JGlass。我检查了CXF。写了一个答案是什么使它起作用。谢谢

标签: soap jax-ws


【解决方案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");
        }
    });

【讨论】:

  • 太棒了,你成功了 - 很高兴我能帮助你指出正确的方向!
猜你喜欢
  • 2015-11-26
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2015-04-17
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多