Что такое отправка "ВКЛЮЧИТЬ" в DispatcherServlet? - PullRequest
1 голос
/ 14 марта 2019

Вопрос

Что такое отправка "ВКЛЮЧИТЬ" из org.springframework.web.servlet.DispatcherServlet?

Как это происходит

Вызывается, когда моя пользовательская реализация javax.servlet.Filter выдает исключение после , обработка запроса завершается:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
        logger.debug("My pre-processing happens here...");

        chain.doFilter(request, response); // request processing by @RestController happens here
    } finally {
        logger.error("Exception thrown here!");
        throw new CustomException("My custom error message");
    }
}

Примеры журналов

[2019.03.13 19:58:19.566] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] m.RequestFilter                            : My pre-processing happens here...
[2019.03.13 19:58:19.570] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] o.s.w.s.DispatcherServlet                  : GET "/resource", parameters={}
[2019.03.13 19:58:19.574] [ERROR] 11148 [https-jsse-nio-8443-exec-7] m.RequestFilter                            : Exception thrown here!
[2019.03.13 19:58:19.578] [ERROR] 11148 [https-jsse-nio-8443-exec-7] o.a.c.c.C.[.[.[.[dispatcherServlet]        : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

m.CustomException: My custom error message
    at m.RequestFilter.doFilter(RequestFilter.java:18) ~[classes/:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.14.jar:9.0.14]
    at java.lang.Thread.run(Thread.java:834) [?:?]

[2019.03.13 19:58:19.590] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] o.s.w.s.DispatcherServlet                  : "INCLUDE" dispatch for GET "/error", parameters={}
[2019.03.13 19:58:19.594] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] o.s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to public org.springframework.http.ResponseEntity m.CustomErrorController.handleError(javax.servlet.http.HttpServletRequest)
[2019.03.13 19:58:19.594] [ERROR] 11148 [https-jsse-nio-8443-exec-7] m.CustomErrorController                    : HTTP Error: OK (200), Servlet Name: dispatcherServlet, Request URI: /resource, Exception: m.CustomException: My custom error message
[2019.03.13 19:58:19.594] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor    : Found 'Content-Type:text/html;charset=UTF-8' in response
[2019.03.13 19:58:19.598] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor    : Writing ["{"path":"/resource","error":"OK","message":"My custom error message","timestamp":"2019.03.13 19:58:19.594","status":200}"]
[2019.03.13 19:58:19.598] [DEBUG] 11148 [https-jsse-nio-8443-exec-7] o.s.w.s.DispatcherServlet                  : Exiting from "INCLUDE" dispatch, status 200

Ответ API

Возвращенный ответ правильный. Кажется, что исходный ответ без ошибок для запрошенного /resource возвращается до обработки ошибки, потому что исключение выдается после обработки запроса. И только после этого создается диспетчеризация «INCLUDE», которая отображается в моей пользовательской реализации ErrorController.

Но если ...

  1. ... правильный ответ уже отправлен, ...
  2. ... и исключение сопоставлено с моим обычаем ErrorController, ...

... затем почему код ответа не является каким-либо типом ошибки, а вместо этого 200 OK в качестве исходного ответа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...