Thursday, 11 May 2017

Spring Boot Web Request Redirected to Dispatcher Again






If you like me followed https://spring.io/guides/gs/spring-boot/ and not able to open a web page hosted by Spring Boot , then this post may help you.






Let's say you are using Spring Boot 1.5.3.RELEASE and have a controller defined as below :

package com.cn.junjun.spring.sample.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class AuthController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String displayLoginPage() {
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login() {
return "forward:/rest/todo/list";
}
@RequestMapping(value = "/logout", method = RequestMethod.POST)
public String logout() {
return "/login";
}
}


When you put http://localhost:8080/login in the browser, it would end up below error :


2017-05-12 13:33:58.342 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/login]
2017-05-12 13:33:58.344 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /login
2017-05-12 13:33:58.345 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [java.lang.String YourController.login()]
2017-05-12 13:33:58.345 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'yourController'
2017-05-12 13:33:58.345 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/login] is: -1
2017-05-12 13:33:58.352 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, application/xhtml+xml, image/webp, application/xml;q=0.9, */*;q=0.8] based on Accept header types and producible media types [*/*])
2017-05-12 13:33:58.352 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.servlet.view.BeanNameViewResolver : No matching bean found for view name 'login'
2017-05-12 13:33:58.354 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Invoking afterPropertiesSet() on bean with name 'login'
2017-05-12 13:33:58.354 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springframework.web.servlet.view.InternalResourceView: name 'boot/init'; URL [/WEB-INF/jsp/login.jsp]] based on requested media type 'text/html'
2017-05-12 13:33:58.354 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'boot/init'; URL [/WEB-INF/jsp/login.jsp]] in DispatcherServlet with name 'dispatcherServlet'
2017-05-12 13:33:58.356 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.servlet.view.InternalResourceView : Forwarding to resource [/WEB-INF/jsp/boot/init.jsp] in InternalResourceView 'login'
2017-05-12 13:33:58.358 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/WEB-INF/jsp/login.jsp]
2017-05-12 13:33:58.358 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /WEB-INF/jsp/login.jsp
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/WEB-INF/jsp/login.jsp]
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/WEB-INF/jsp/login.jsp] are [/**]
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/WEB-INF/jsp/login.jsp] are {}
2017-05-12 13:33:58.362 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/WEB-INF/jsp/login.jsp] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@ca27722]]] and 1 interceptor
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/WEB-INF/jsp/login.jsp] is: -1
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Successfully completed request
2017-05-12 13:33:58.363 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Successfully completed request
2017-05-12 13:33:58.364 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@2508c551
2017-05-12 13:33:58.364 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error]
2017-05-12 13:33:58.364 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error
2017-05-12 13:33:58.365 DEBUG 3040 --- [nio-6080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]
2017-05-12 13:33:58.365 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'basicErrorController'
2017-05-12 13:33:58.365 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Last-Modified value for [/error] is: -1
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html])
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'error'
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.b.f.s.DefaultListableBeanFactory : Invoking afterPropertiesSet() on bean with name 'error'
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@4f63ed4b] based on requested media type 'text/html'
2017-05-12 13:33:58.370 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Rendering view [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@4f63ed4b] in DispatcherServlet with name 'dispatcherServlet'
2017-05-12 13:33:58.388 DEBUG 3040 --- [nio-6080-exec-1] o.s.web.servlet.DispatcherServlet : Successfully completed request


From the console error log we can tell that request reached controller then system should load the resource login.jsp accordingly , but login.jsp is considered as a request since no controller is listening on login.jsp then it becomes NOT FOUND. 




How to resolve it ?


STEP 1 : add below dependency to POM 

<dependency>
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-jasper</artifactId>
     <scope>provided</scope>
 </dependency>

<dependency>    

    <groupId>javax.servlet</groupId>    
    <artifactId>jstl</artifactId>
</dependency>


STEP 2 : define below class


@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver getViewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
configurer.enable();
}
}
view raw WebConfig.java hosted with ❤ by GitHub




DONE

No comments:

Post a Comment

Flag Counter