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

时间:2013-11-19 22:40:37

标签: json rest post jersey jetty

使用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>

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

  

WARN o.e.j.server.AbstractHttpConnection - 标题已满:   java.lang.RuntimeException:Header&gt; 6144

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

  

INFO:1 * LoggingFilter - 在主线上收到的请求
  1>放   http://localhost:8080/rest/doPOST
  1>接受:application / json
  1>   内容类型:application / json
  {“名”:“克里斯   三环”, “trkNbr”: “585802240942”, “rptDt”:NULL, “reqType”: “细节”}

     

2013年11月19日下午12:59:49 org.glassfish.jersey.filter.LoggingFilter日志
  信息:2 * LoggingFilter - 在主线上收到的响应
  2&lt; 500个
  2&lt;   内容长度:0
  2&lt;服务器:Jetty(8.1.13.v20130916)

     

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

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

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

Jetty的日志中没有详细信息,它似乎没有进入Jersey servlet。

1 个答案:

答案 0 :(得分: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>
...

这是一个快速而肮脏的解决方案。

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

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

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