Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么HttpServletRequestInputStream为空?_Java_Servlets_Jetty_Guice - Fatal编程技术网

Java 为什么HttpServletRequestInputStream为空?

Java 为什么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(

我有一段代码,从请求输入流读取输入,并使用JacksonMapper将其转换为POJO。它在Jetty7容器中运行,并支持guice

@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;
}