Web服务请求(> 8KB)因JBOSS上的apache cxf客户端而失败-HTTP响应'411:所需长度' [英] Web service request (>8KB) failed with apache cxf client on JBOSS - HTTP response '411: Length Required'

查看:130
本文介绍了Web服务请求(> 8KB)因JBOSS上的apache cxf客户端而失败-HTTP响应'411:所需长度'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个Web应用程序正在使用apache cxf客户端向远程Web服务发送请求。

A web application is using the apache cxf client to send requests to a remote web service.

当此Web应用程序部署在Tomcat上时,一切正常。

When this web application is deployed on Tomcat everything is OK.

当此Web应用程序部署在JBOSS上且正文(信封)的大小大于8 KB时,请求发送失败。会产生以下错误:

The requests failed to be sent when this web application is deployed on JBOSS AND the size of the body (envelope) is greater than 8 KB; the error below got generated:

17:57:15,387 WARNING [org.apache.cxf.phase.PhaseInterceptorChain (ConnectorExecutor-21) Interceptor for xxx#{http://cxf.apache.org/jaxws/dispatch}Invoke has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Could not send Message.
  at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
  at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:461)
  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:364)
  at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:317)
  at org.apache.cxf.endpoint.ClientImpl.invokeWrapped(ClientImpl.java:352)
  at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:381)
  at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:241)
  ...
  at java.util.concurrent.FutureTask.run(Unknown Source) [rt.jar:1.7.0_45]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_45]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_45]
  at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_45]
Caused by: org.apache.cxf.transport.http.HTTPException: HTTP response '411: Length Required' when communicating with ...
  at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1554)
  at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1493)
  at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1401)
  at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
  at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:648)
  at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
  ... 17 more

HTTP流模式似乎已切换为分块

The HTTP stream mode seems to have switched to chunked.


您如何看待第一个假设?

What do you think of this first assumption?

可以在apache cxf官方文档中找到可以提供一个spring配置文件来更改cxf客户端行为。

It can be found in the official apache cxf documentation that it is possible to provide a spring configuration file in order to change the cxf client behavior.


配置文件的内容是什么?

What is the configuration file content?


推荐答案


我回答了我自己的问题,因为经过额外的测试,下面描述的配置对我有用。

I answer to my own question, because after additional tests, the configuration described below worked for me.

首先,错误是可能是由于cxf客户端自动切换到分块传输模式而产生的;实际上,此答案中描述的配置更改迫使cxf客户端不使用分块,然后成功发送了信封大小大于8 KB的请求。

First, the error was probably generated because the cxf client automatically switched to chunked transfer mode; indeed the configuration change described in this answer forces the cxf client to not use chunking and then requests get successfully sent with envelope size greater than 8 KB.

根据官方cxf apache文档,可以使用Spring配置文件来更改cxf客户端的行为:

The cxf client behavior can be changed using a Spring configuration file, according to the official cxf apache documentation:

  • https://cxf.apache.org/docs/client-http-transport-including-ssl-support.html
  • https://cxf.apache.org/docs/configuration.html

无需更改Java客户端的代码行。

There is no need to change the lines of code of the java client.

创建一个 cxf.xml 春季配置文件:

Create a cxf.xml spring configuration file:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <http-conf:conduit name="*.http-conduit">
        <http-conf:client AllowChunking="false"/>
    </http-conf:conduit>
</beans>



-2- cxf.config.file.url java系统属性



编辑JBOSS批处理或脚本文件,以便将此系统属性添加到java命令。

- 2- cxf.config.file.url java system property

Edit JBOSS batch or script files in order to add this system property to java command.

该值是指向cxf.xml的URL。文件,Windows示例如下所示:

The value is the URL that points to cxf.xml file, a windows example is shown below:

-Dcxf.config.file.url=file:/C:/JBoss-7.1.1.Final/standalone/configuration/cxf.xml




有下面是Linux / UNIX的示例:

There is below an example for Linux/UNIX:



-Dcxf.config.file.url=file:///home/jay/as/JBoss-7.1.1.Final/standalone/configuration/cxf.xml



-3-重新启动JBOSS



-4-测试



-5-忽略警告发送请求时生成的消息



- 3- Restart JBOSS

- 4- Test

- 5- Ignore the WARNING message generated when the request is sent

16:23:03,388 INFO  [org.apache.cxf.bus.spring.ControlledValidationXmlBeanDefinitionReader] (ConnectorExecutor-1) Loading XML bean definitions from URL [file:/C:/JBoss-7.1.1.Final/standalone/configuration/cxf.xml]
16:23:06,535 WARNING [org.jboss.wsf.stack.cxf.client.configuration.JBossWSSpringBusFactory] (ConnectorExecutor-1) INITIAL_APP_CONTEXT_CREATION_FAILED_MSG: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/transports/http/configuration]
Offending resource: URL [file:/C:/JBoss-7.1.1.Final/standalone/configuration/cxf.xml]

    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:316) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]

我认为NamespaceHandler rel = nofollow> http://cxf.apache.org/transports/http/configuration 应该找到XML模式命名空间,因为下面有这个jar:

I think that the NamespaceHandler for http://cxf.apache.org/transports/http/configuration XML schema namespace should be found because there is this jar below:

C:/JBoss-7.1.1.Final/modules/org/apache/cxf/main/cxf-rt-transports-http-2.4.6.jar




无论如何,Web服务请求已成功发送!

Anyway, the webservice request is successfuly sent !!

这篇关于Web服务请求(&gt; 8KB)因JBOSS上的apache cxf客户端而失败-HTTP响应'411:所需长度'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆