非法状态异常:不支持在AsyncContext.startAsync(req, res)上操作。

13

我创建了一个Servlet 3.0来探索异步请求处理:

@WebServlet(name="MyTest", urlPatterns={"/MyTest"}, asyncSupported=true)
public class MyTest extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        AsyncContext tmp = req.startAsync(req, res);
        ...

    }    

}

但是当调用.startAsync(...)时,我会得到一个IllegalStateException。我知道Javadoc提到了这个异常,但我明确启用了异步(参见WebServlet注释)。我正在使用由NetBeans提供的Tomcat 7.0.11.0。

我可以确认req.isAsyncSupported()返回false。我做错了什么?我需要做什么才能启用异步处理?

编辑:

我试图实现以下示例,并遇到了相同的问题。


我现在已经重新安装了NetBeans 7.0.1,它带有Tomcat 7.0.14,但我仍然遇到同样的问题。 - Jérôme Verstrynge
2个回答

29

我查看了Tomcat的代码,发现asyncSupported变量必须显式设置为true。这就是为什么你会得到req.isAsyncSupported() == false

您可以尝试通过以下方法之一将HttpServletRequest对象中的async属性设置为true。

req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
或者
((org.apache.catalina.connector.Request)req).setAsyncSupported(true);

希望能对你有所帮助。


2
请求不是 org.apache.catalina.connector.Request 类型,但将 ASYNC_SUPPORTED 设置为 true 可以工作!!! - Jérôme Verstrynge

8
请检查是否有任何请求过滤器未启用以支持异步。您可以暂时删除过滤器或将其标记为支持异步。

例如(如果您在web.xml中定义了筛选器); <async-supported> true </ async-supported> - Per Lindberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接