spring boot -thymeleaf-异常处理

异常流程 :controller-ControllerAdvice-异常解析器-默认的error页面html

1.错误页面error.html:spring

  程序出现异常会自动跳到error.html里,视频效果,该页面可使用th:text="${exception}"显示异常信息,但本身测试时,页面成功显示,但异常信息不显示。json

2.@ExceptionHandler注解处理异常(有两个处理同一个异常的方法,则启动报错;同时存在@ControllerAdvice优先于@ControllerAdvice处理异常。app

spring boot 默认状况下会映射到 /error 进行异常处理,可是提示并不十分友好,下面自定义异常处理,提供友好展现。测试

 

3.@ControllerAdvice+.@ExceptionHandler处理异常(同时有两个类,两个类都会加载,对于两个类都有同一个异常方法,最终只会执行其中一个类的方法)spa

在Controller中抛出的异常,当没有被catch处理时,GlobalExceptionHandler中定义的处理方法能够起做用,在方法写明注解@ExceptionHandler,并注明其异常类便可。此种方法不只能够做用于Controller,一样的在DAO层、service层也可,均可以由GlobalExceptionHandler进行处理。此种写法减小代码的入侵,值得推荐。指针

若是所有异常处理返回json,那么可使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就能够不须要添加 @ResponseBody。

在spring 3.2中,新增了@ControllerAdvice 注解,能够用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到全部@RequestMapping中。

@ModelAttribute:在Model上设置的值,对于全部被 @RequestMapping 注解的方法中,均可以经过 ModelMap 获取,以下:

@RequestMapping("/home")
public String home(ModelMap modelMap) {
    System.out.println(modelMap.get("author"));
}

//或者 经过@ModelAttribute获取

@RequestMapping("/home")
public String home(@ModelAttribute("author") String author) {
    System.out.println(author);
}

 

4.配置SimpleMappingExceptionResolver类完成异常处理rest

 

5.自定义HandlerExceptionResolver类处理异常(若是同时定义两个类,只会加载其中一个类code

public class GlobalException2 implements HandlerExceptionResolver {

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView("error");
        if (ex instanceof NullPointerException) {
            modelAndView.addObject("errors","自定义2解析器空指针N"+ex.toString());
        }