Close

Spring MVC - HandlerExceptionResolver Examples

Spring MVC 


HandlerExceptionResolver can be implemented by the application to resolve exceptions thrown during processing an HTTP request. Exception can be thrown by one of the application's handler methods or outside of it but during processing a request. The method, HandlerExceptionResolver#resolveException(), returns an instance of ModelAndView specifying an error page. The Implementations are typically registered as beans in the application context. The application registered HandlerExceptionResolvers will only be invoked if the exception is not already handled by the default HandlerExceptionResolvers. We can, however, change the order of the resolvers so that a given resolver can be invoked first.


package com.logicbig.example;

import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@EnableWebMvc
public class Config {

@Bean
HandlerExceptionResolver errorHandler () {
return new HandlerExceptionResolver() {
@Override
public ModelAndView resolveException (HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
ModelAndView model = new ModelAndView("error-page");
model.addObject("exceptionType", ex);
model.addObject("handlerMethod", handler);
return model;
}
};
}

//registering an interceptor
@Bean
public WebMvcConfigurer webMvcConfigurer () {
return new WebMvcConfigurerAdapter() {
@Override
public void addInterceptors (InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptorAdapter() {
@Override
public boolean preHandle (HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
if (request.getParameter("testParam") != null) {
throw new Exception("exception from interceptor");
}
return true;
}
});
}
};
}

@Bean
public ViewResolver viewResolver () {
InternalResourceViewResolver viewResolver =
new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}

@Bean
public ExampleController myMvcController () {
return new ExampleController();
}
}
package com.logicbig.example;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ExampleController {

@RequestMapping("/")
public void handleRequest () {
//just for testing
throw new RuntimeException();
}

@RequestMapping("/test")
@ResponseBody
public String testHandler () {
return "test body";
}
}

src/main/webapp/WEB-INF/pages/error-page.jsp:

<%@ page language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>

<html>
<body>
<h3>This is example exception page</h3>
<p>Exception: <b>${exceptionType}</b></p>
<p>Handler method: <b> ${handlerMethod} </b></p>

</body>
</html>
Original Post




This example shows how to use HandlerExceptionResolverComposite which is an implementation of HandlerExceptionResolver. This resolvers iterates it's list of HandlerExceptionResolvers, the first one to resolve the exception wins and rest of the resolvers are not processed.

package com.logicbig.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.handler.HandlerExceptionResolverComposite;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import java.util.Arrays;
import java.util.Properties;

@EnableWebMvc
@ComponentScan("com.logicbig.example")
public class AppConfig {

@Bean
HandlerExceptionResolver exceptionResolverComposite () {
HandlerExceptionToViewResolver r = new HandlerExceptionToViewResolver();

SimpleMappingExceptionResolver s = new SimpleMappingExceptionResolver();
s.setDefaultErrorView("default-error-page");
Properties p = new Properties();
p.setProperty(IllegalAccessException.class.getName(), "simple-test-error-view");
s.setExceptionMappings(p);

HandlerExceptionResolverComposite c = new HandlerExceptionResolverComposite();
c.setExceptionResolvers(Arrays.asList(r, s));
return c;
}

@Bean
public ViewResolver viewResolver () {
InternalResourceViewResolver viewResolver =
new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
Original Post




package com.logicbig.example;

import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HandlerExceptionToViewResolver implements HandlerExceptionResolver {

@Override
public ModelAndView resolveException (HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {

if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
ErrorView errorView = hm.getMethodAnnotation(ErrorView.class);
if (errorView != null) {
//preparing ModelAndView
String viewName = errorView.value();
ModelAndView model = new ModelAndView(viewName);
model.addObject("requestUri", request.getRequestURI());
model.addObject("exception", ex);

HttpStatus status = errorView.status();
model.addObject("statusValue", status.value());
model.addObject("statusStr", status.getReasonPhrase());
//setting status code
response.setStatus(status.value());

return model;
}
}
//returning null for default processing
return null;

}
}
package com.logicbig.example;

import org.springframework.http.HttpStatus;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ErrorView {

String value ();

HttpStatus status () default HttpStatus.INTERNAL_SERVER_ERROR;
}
package com.logicbig.example;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.naming.OperationNotSupportedException;

@Controller
public class ExampleController {

@ErrorView(value = "test-error-view", status = HttpStatus.GONE)
@RequestMapping("/test")
public String handleRequest () throws Exception {
throw new Exception("test exception");
}

@RequestMapping("/test2")
public String handleRequest2 () throws Exception {
throw new OperationNotSupportedException("exception thrown in test2");
}

@ExceptionHandler
@ResponseBody
public String handleException (OperationNotSupportedException e) {
return "exception :" + e.toString();
}
}
package com.logicbig.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@EnableWebMvc
@ComponentScan("com.logicbig.example")
public class AppConfig {

@Bean
HandlerExceptionResolver customExceptionResolver () {
return new HandlerExceptionToViewResolver();
}

@Bean
public ViewResolver viewResolver () {
InternalResourceViewResolver viewResolver =
new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
Original Post




    @Bean(DispatcherServlet.HANDLER_EXCEPTION_RESOLVER_BEAN_NAME)
HandlerExceptionResolver customExceptionResolver (ApplicationContext ac) {

ExceptionHandlerExceptionResolver e = new ExceptionHandlerExceptionResolver();
e.setApplicationContext(ac);
e.afterPropertiesSet();

SimpleMappingExceptionResolver s = new SimpleMappingExceptionResolver();
s.setDefaultErrorView("default-error");
s.setDefaultStatusCode(HttpStatus.INTERNAL_SERVER_ERROR.value());

HandlerExceptionResolverComposite c = new HandlerExceptionResolverComposite();
c.setExceptionResolvers(Arrays.asList(e, s));
return c;
}




See Also