Java 为什么HttpServletRequestInputStream为空?
我有一段代码,从请求输入流读取输入,并使用JacksonMapper将其转换为POJO。它在Jetty7容器中运行,并支持guiceJava 为什么HttpServletRequestInputStream为空?,java,servlets,jetty,guice,Java,Servlets,Jetty,Guice,我有一段代码,从请求输入流读取输入,并使用JacksonMapper将其转换为POJO。它在Jetty7容器中运行,并支持guice @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { RequestType requestType = mapper.readValue(
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
RequestType requestType = mapper.readValue(req.getInputStream(), RequestType.class);
} Catch(Exception ex) {
....
}
}
但是,有时在加载时会引发以下异常。我已经检查了我的客户端,我确信它发送了一个有效的json字符串。出什么事了?码头7在荷载作用下是否具有预期性能
java.io.EOFException: No content to map to Object due to end of input
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2433)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2385)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1637)
at com.ea.wsop.user.LoginServlet.processRequest(LoginServlet.java:69)
at com.ea.wsop.user.LoginServlet.doPost(LoginServlet.java:63)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.CGLIB$doPost$0(<generated>)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd$$FastClassByGuice$$c6f479ee.invoke(<generated>)
at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72)
at com.ea.monitor.MethodExecutionTimer.invoke(MethodExecutionTimer.java:130)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72)
at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.doPost(<generated>)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.CGLIB$service$8(<generated>)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd$$FastClassByGuice$$c6f479ee.invoke(<generated>)
at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72)
at com.ea.monitor.MethodExecutionTimer.invoke(MethodExecutionTimer.java:130)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72)
at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.service(<generated>)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.CGLIB$service$9(<generated>)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd$$FastClassByGuice$$c6f479ee.invoke(<generated>)
at com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72)
at com.ea.monitor.MethodExecutionTimer.invoke(MethodExecutionTimer.java:130)
at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:72)
at com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52)
at com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.service(<generated>)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
java.io.EOFException:由于输入结束,没有要映射到对象的内容
位于org.codehaus.jackson.map.ObjectMapper.\u initForReading(ObjectMapper.java:2433)
位于org.codehaus.jackson.map.ObjectMapper.\u readMapAndClose(ObjectMapper.java:2385)
位于org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1637)
位于com.ea.wsop.user.LoginServlet.processRequest(LoginServlet.java:69)
位于com.ea.wsop.user.LoginServlet.doPost(LoginServlet.java:63)
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.CGLIB$doPost$0()上
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd$$FastClassByGuice$$c6f479ee.invoke()上
位于com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
在com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.procedure(InterceptorStackCallback.java:72)上
位于com.ea.monitor.MethodExecutionTimer.invoke(MethodExecutionTimer.java:130)
在com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.procedure(InterceptorStackCallback.java:72)上
位于com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52)
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.doPost()上
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.CGLIB$service$8()上
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd$$FastClassByGuice$$c6f479ee.invoke()上
位于com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
在com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.procedure(InterceptorStackCallback.java:72)上
位于com.ea.monitor.MethodExecutionTimer.invoke(MethodExecutionTimer.java:130)
在com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.procedure(InterceptorStackCallback.java:72)上
位于com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52)
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.service()上
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.CGLIB$service$9()上
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd$$FastClassByGuice$$c6f479ee.invoke()上
位于com.google.inject.internal.cglib.proxy.$MethodProxy.invokeSuper(MethodProxy.java:228)
在com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.procedure(InterceptorStackCallback.java:72)上
位于com.ea.monitor.MethodExecutionTimer.invoke(MethodExecutionTimer.java:130)
在com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.procedure(InterceptorStackCallback.java:72)上
位于com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:52)
在com.ea.wsop.user.LoginServlet$$EnhancerByGuice$$a91c2ebd.service()上
位于com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
如果事先已经用完,则它将为空。无论何时在HttpServletRequest
上调用getParameterValues()
,getParameterMap()
,getReader()
等,都会隐式执行此操作。确保在调用getInputStream()
之前,不要调用任何一种自己需要从请求主体收集信息的方法。如果servlet没有这样做,那么开始检查映射到同一URL模式的servlet过滤器
更新:这似乎是针对GAE 1.5的。另见
恐怕在他们修复之前没有解决方案/解决办法。您可以尝试检查它是否在
过滤器中可用,如果可用,则将其复制并存储为请求属性。但这可能会影响某些GAE servlet的进一步处理。我的问题是,Jetty 6.1.15的请求InputStream始终为空,并发现这是由于缺少或错误的“内容类型”头造成的
我使用HttpUrlConnection在另一个Java程序中生成请求。当我没有显式设置内容类型头时,接收程序中由request.getInputStream()
返回的InputStream
总是空的。当我将内容类型设置为“二进制/八位字节流”时,请求的InputStream
包含正确的数据
在getInputStream()
之前,对请求对象调用的唯一方法是getContentLength()
我使用的是mod_jk 1.2.39,它有一个导致此问题的错误。更新到1.2.40后,它开始工作。我在运行Spring启动应用程序时遇到了类似的问题。我的Spring Boot应用程序是一个简单的Dispatcher
servlet,它读取请求主体并对其进行处理
在我的例子中,如果curl命令行使用-d{some data}
并且没有通过-Hcontent type=some other media type
设置特定的内容类型头,那么客户端(curl
)将设置application/x-www-form-urlencoded的内容类型头
在Spring Boot运行的Apache Catalina servlet引擎中,请求
类在parseParameters()
对于其他内容类型
值,请求
在此处返回,完成
但是,如果内容类型匹配
if (!("application/x-www-form-urlencoded".equals(contentType))) {
success = true;
return;
}
try {
if (readPostBody(formData, len) != len) {
parameters.setParseFailedReason(FailReason.REQUEST_BODY_INCOMPLETE);
return;
}
} catch (....)
@Bean
public FilterRegistrationBean registration(HiddenHttpMethodFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}