пересылка запросов с помощью пружинного веб-потока ServletHttpHandlerAdapter в контейнере сервлета 3.1 - PullRequest
0 голосов
/ 04 января 2019

Согласно документации на контейнере сервлета 3.1 ServletHttpHandlerAdapter может быть зарегистрирован как сервлет и может поддерживать 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 для обсуждения - Ссылка

1 Ответ

0 голосов
/ 05 января 2019

Spring WebFlux можно развернуть в контейнере Servlet 3.1 благодаря ServletHttpHandlerAdapter - но это не значит, что вам разрешено использовать специфичные для Servlet API в этом приложении.

Во-первых, как только выиспользуя функции сервлета асинхронного ввода-вывода, вы не можете смешивать их с блокировкой вызовов ввода-вывода в API сервлета ( см. эту презентацию об асинхронном вводе-выводе Servlet 3.1 ).

Итакв общем, вы никогда не должны пытаться получить специфичные для сервлетов объекты из ServerWebExchange, а должны использовать код для этого нового HTTP-основания в Spring WebFlux.

Существует проблема с поддержкой пересылки в WebFlux.уровень , но я не уверен, что это в конечном итоге решит вашу проблему.Я не понимаю специфики проблемы, с которой вы сталкиваетесь, но Spring WebFlux уже поддерживает шаблонизаторы, которые используют блокирующий ввод / вывод (, см. Поддержку Freemarker здесь ).

Если шаблонизаторМеханизм, который вы пытаетесь поддерживать, привязан к сервлету, поэтому вы не сможете получить надлежащую поддержку WebFlux, так как можете запускать приложения Spring WebFlux в средах без сервлетов.

...