3

在处理 SOAP Web 服务响应时,我在 Jaxws 客户端中遇到异常,这是巨大的。这在 Jboss 5.1 中运行良好。但我将 Jboss 升级到 AS 7 并开始出现错误。

Caused by: javax.xml.ws.soap.SOAPFaultException: reach the innerElementCountThreshold:50000
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:157)
    at com.sun.proxy.$Proxy41.getAllJobHistory(Unknown Source)
    at com.ep.service.impl.StatusSearchServiceImpl.findAll(StatusSearchServiceImpl.java:38) [classes:]
    at com.ep.controller.StatusBean.retrieveHistoryList(StatusBean.java:145) [classes:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_45]
    at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_45]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:258) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) [jsf-facelets-1.1.15.jar:1.1.15]
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jsf-api-1.2_15-b01-redhat-3.jar:1.2_15-b01-redhat-3]
    ... 31 more
Caused by: org.apache.cxf.staxutils.DepthExceededStaxException: reach the innerElementCountThreshold:50000
    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:1199)
    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:1129)
    at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:223)
    at org.apache.cxf.jaxws.handler.soap.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:78)
    at org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.createProtocolMessageContext(SOAPHandlerInterceptor.java:257)
    at org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.handleMessageInternal(SOAPHandlerInterceptor.java:161)
    at org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.handleMessage(SOAPHandlerInterceptor.java:124)
    at org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.handleMessage(SOAPHandlerInterceptor.java:71)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:800)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1704)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1537)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1445)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:660)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)

有没有办法增加客户端初始化的响应阈值?我尝试了以下逻辑但没有奏效。感谢你的帮助。

  BindingProvider.getRequestContext().put("org.apache.cxf.stax.maxChildElements", -1);
4

3 回答 3

3

Jboss AS 7 使用新的 Apache CXF 版本,其中包括更好的安全策略,执行此检查以防止具有非常大的肥皂响应负载的攻击。

我有同样的问题,我也在使用 JAX-WS 处理程序。由于我的 Jax-ws 处理程序的存在,我使用 BindingProvider 或 org.apache.cxf.Bus 的解决方案不起作用。

这是一个已知问题: https ://issues.apache.org/jira/browse/CXF-6173 但是,这个问题的修复在 Apache CXF 版本 3.0.4 中,它还没有包含在 JBoss EAP 版本中。

因此,我实施了一个临时修复,使用standalone.bat.conf 文件设置系统参数。这是我在standalone.bat.conf 文件中包含的内容:

set "JAVA_OPTS=%JAVA_OPTS% -Dorg.apache.cxf.stax.maxChildElements=10000000"

它工作正常。

于 2015-03-03T10:08:17.147 回答
3

我遇到了类似的问题。类上有一个static方法StaxUtils(至少在我使用的版本中)来设置innerElementCountThreshold. StaxUtils.setInnerElementCountThreshold(-1)我在我的应用程序的初始化代码中添加了一个调用,问题就消失了。

于 2014-03-26T19:30:34.017 回答
0

它是一个静态成员,似乎可以使用拦截器链来配置它。但是,我还没有找到一种有效的方法来做到这一点。文件说你可以做到总线或端点级别,但它对我不起作用。

于 2014-09-03T05:00:34.303 回答