根据servlet 3.1 容器上的文档,ServletHttpHandlerAdapter 可以注册为 servlet 并且可以支持 nio。我需要将请求转发到其他资源,如下所示
asyncContext.getRequest().getServletContext().getRequestDispatcher("/OtherResource")
.forward(asyncContext.getRequest(), asyncContext.getResponse());
在呼叫转发时,我遇到了错误。
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:624)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211)
at com.nucleus.OtherServlet.doGet(OtherServlet.java:30)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:470)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
at com.nucleus.AsyncRequestProcessor.run(AsyncRequestProcessor.java:55)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
哪个是正确的,因为 spring 创建了 org.springframework.http.server.reactive.ServletServerHttpResponse 并最初调用 response.getOutputStream(),现在如何支持请求转发?
问题也记录到 spring jira 以供讨论 -链接