使用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。
答案 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,它就可以开始正常生成,此时你可以捕获并查看它。