获得Jetty 8.1,将Jersey 2.4作为REST Servlet:

<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看到了这个奇怪的错误:


警告o.e.j.server.AbstractHttpConnection-标头已满:
java.lang.RuntimeException:标头> 6144


客户端仅看到HTTP 500响应,没有任何详细信息:


INFO:1 * LoggingFilter-在线程main上收到请求
1>放置
http://localhost:8080/rest/doPOST
1>接受:application / json
1>
内容类型:application / json
{“ name”:“ Kris
Kringle“,” trkNbr“:” 585802240942“,” rptDt“:null,” reqType“:” detail“}

2013年11月19日12:59:49 PM org.glassfish.jersey.filter.LoggingFilter日志
INFO:2 * LoggingFilter-在线程main上收到响应
2 2 <
内容长度:0
2
线程“主”中的异常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中。

最佳答案

关于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,它可能会开始正确生成,此时您可以捕获并查看它。

09-30 18:40