方式一:@ControllerAdvice注解
使用注解方式AOP全局处理异常,配合@ExceptionHandler使用
@ControllerAdvice,是Spring3.2提供的新注解,是一个Controller增强器,可对controller中被 @RequestMapping标注的方法加一些逻辑处理。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public ModelAndView exceptionHandler(Exception ex){
ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
mv.addObject("message",ex.getMessage());
mv.addObject("code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return mv;
}
}
ExceptionHandler(value = Exception.class)==>ExceptionHandler(value = RuntimeException.class) handleGlobalException(Exception ex)==>handleGlobalException(RuntimeException ex) Runtime Exception 是 继承自 Exception的; Runtime Exception 是 虚拟机正常运行时候的异常,是try catch有可能捕获不到的。 所以通常Exception,范围更大。
方式二:实现HandlerExceptionResolver接口
除了注解的方式以外,还可以实现HandlerExceptionResolver该异常处理器接口,重写resolveException方法,对异常进行处理。
1.写全局异常处理器实现类
@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
mv.addObject("message",ex.getMessage());
mv.addObject("code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return mv;
}
}
2.注册全局异常处理器
@Configuration
public class GlobalExceptionHandlerConfig implements WebMvcConfigurer {
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new GlobalExceptionHandler());
}
}