JBOSS 服务器内部的 SOAP 客户端/代理警告和错误不在外部

Posted

技术标签:

【中文标题】JBOSS 服务器内部的 SOAP 客户端/代理警告和错误不在外部【英文标题】:SOAP Client/Proxy Warning and Errors inside JBOSS Server not outside 【发布时间】:2017-04-15 05:57:49 【问题描述】:

我正在实现一个特定供应商的 SOAP 服务客户端。其中大约有 7 个左右,我遇到了每个都有自己的挑战。但是,对于这个特定的实例,我遇到了一个新问题。

在我的 jboss 服务器之外,我可以让客户端实现运行良好,完全没有问题。不过,在 Insdie jboss/wildfly 8 中,我在进行 SOAP 调用时直接收到警告并出现错误(见下文)。

我有几个问题难以追查,首先列出了最重要的问题。

    如何找出在 PhaseInterceptorChain 内导致此错误的操作是什么,这是我收到错误的原因吗? 错误字符串,我可以很容易地添加内容类型等等,但为什么我必须这样做呢?客户不应该已经这样做了吗? 我们尽可能避免使用 apache cxf。我没有明确看到它在我的源代码或使用 ws-import 生成的源代码的任何地方被调用。我们甚至在构建路径中也没有它。为什么 apache cxf 到处出现这些错误?

开始警告:

2016-11-30 12:46:21,213 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] Interceptor for http:<removed url>/<removed class>/<removed class>#http://<removed url>/<removed method> has thrown exception, unwinding now: java.lang.UnsupportedOperationException
    at java.util.AbstractMap.put(AbstractMap.java:209) [rt.jar:1.8.0_65]
    at org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor.setSoapAction(SoapPreProtocolOutInterceptor.java:122)
    at org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor.handleMessage(SoapPreProtocolOutInterceptor.java:63)
    at org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor.handleMessage(SoapPreProtocolOutInterceptor.java:47)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
    at com.sun.proxy.$Proxy154.<removed metho>(Unknown Source)

启动错误:

2016-11-30 12:46:21,257 ERROR [com.<removed class>] Fault string, and possibly fault code, not set: javax.xml.ws.soap.SOAPFaultException: Fault string, and possibly fault code, not set
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:157)
    at com.sun.proxy.$Proxy154.<removed metho>(Unknown Source)
    removed misc lines
Caused by: java.lang.UnsupportedOperationException
        at java.util.AbstractMap.put(AbstractMap.java:209) [rt.jar:1.8.0_65]
        at org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor.setSoapAction(SoapPreProtocolOutInterceptor.java:122)
        at org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor.handleMessage(SoapPreProtocolOutInterceptor.java:63)
        at org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor.handleMessage(SoapPreProtocolOutInterceptor.java:47)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
        ... 10 more

非常感谢任何帮助。在发布之前,我确实尝试过搜索互联网(***、jboss 开发人员等)。

【问题讨论】:

原来 cxf 在我们的 jboss 模块中分层很深,所以我想这回答了它是如何找到要使用的类的。 【参考方案1】:

我找到了关于这个问题的文章 http://mariemjabloun.blogspot.com/2013/10/javalangunsupportedoperationexception.html

实际上,这个拦截器会尝试向您的请求添加新标头,如果您有类似的代码

bp.getRequestContext().put(
    MessageContext.HTTP_REQUEST_HEADERS,
    Collections.singletonMap("Cookie", Collections.singletonList(yourCookieString)
);

您应该将不可变单例映射更改为可变映射(例如 HashMap)

【讨论】:

以上是关于JBOSS 服务器内部的 SOAP 客户端/代理警告和错误不在外部的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jBoss 中启用 CORS

急啊!c#怎么通过SOAP调用服务器的方法,已经知道方法名

从 Silverlight 访问 Rally SOAP 服务

soap协议

如何解析从文件加载的soap消息?

通过 XMPP 进行 SOAP/REST 调用