Jersey Client POST结果为 - header full:java.lang.RuntimeException:Header> 6144

Kar*_*roy 4 rest post json jetty jersey

使用Jersey 2.4作为REST servlet获得Jetty 8.1:

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.foo.rest;org.bar.rest</param-value>
        </init-param>
Run Code Online (Sandbox Code Playgroud)

GET响应工作正常,但是当我尝试POST时,从Jetty看到这个奇怪的错误:

WARN oejserver.AbstractHttpConnection - 标头已满:java.lang.RuntimeException:Header> 6144

客户端只看到没有详细信息的HTTP 500响应:

信息:1*LoggingFilter - 在主线程
1 上收到的请求> PUT http://localhost:8080/rest/doPOST
1>接受:application/json
1> Content-Type:application/json
{"name":"Kris Kringle","trkNbr":"585802240942","rptDt ":空," reqType ":"细节"}

2013年11月19日12:59:49 org.glassfish.jersey.filter.LoggingFilter log
INFO:2*LoggingFilter - 线程主
2 上收到的响应<500
2 <Content-Length:0
2 <Server:Jetty(8.1.13 .v20130916)

线程"main"中的异常javax.ws.rs.InternalServerErrorException: org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:929)中的
HTTP 500服务器错误

请求是这样的{在目标之后}:

TestPOJO responseMsg = target.path("/rest/doPOST")
                .request(MediaType.APPLICATION_JSON)
                .put(Entity.json(reqPOJO), TestPOJO.class);
Run Code Online (Sandbox Code Playgroud)

在Jetty的日志中没有细节,它似乎没有进入Jersey servlet.

Joa*_*elt 6

错误header full: java.lang.RuntimeException: Header>6144意味着您的响应标头大小超过6144字节.标头容量为6144字节,生成的标头超出了它.

为什么选择6144?好吧,这是根据您的Buffers实施计算的.

Buffers您使用的是什么实现?这取决于Connector你正在使用的.

你可以AbstractConnector.setResponseHeaderSize(int)为自己设置更大的东西.

如果您使用独立Jetty,请修改您etc/jetty.xml的以下内容...

...
<Call name="addConnector">
  <Arg>
      <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
        ...
        <Set name="responseHeaderSize">10000</Set>
        ...
      </New>
  </Arg>
</Call>
...
Run Code Online (Sandbox Code Playgroud)

这是一个快速和肮脏的修复您的情况.

我鼓励你找出为什么你有一个大小的响应头!这不正常,可能表明你有一个更广泛和根本的问题.

捕获整个HTTP事务请求+响应,使用wireshark捕获jersey-client和服务器之间的流量.

注意:可能无法从您正在进行的特定调用中看到此错误响应标头,因为Jetty将无法生成标头(因此出现错误)并回退到默认的500错误响应.一旦增加了responseHeaderSize,它就可以开始正常生成,此时你可以捕获并查看它.