SpringMVC--全局异常处理

Posted lxx-1843693653

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC--全局异常处理相关的知识,希望对你有一定的参考价值。

  • 在某个controller中使用ExceptionHandler可以处理当前controller中抛出异常
    • 这个规则与controller中其他方法规则是一样的
    • 这个ExceptionHandler方法可以写很多个,正对不同的异常进行不同的处理
    • 方法参数中可以增加一个异常对象,用来获取

    @RequestMapping("/sqlerror")
    public String sqlerror()throws SQLException{
        throw new SQLException("抛出SQL异常");
    }

    //捕获sql异常
    @ExceptionHandler(SQLException.class)
    public String error(Model model, SQLException ex) {

        model.addAttribute("message",ex.getMessage());
        return "error";
    }
    @RequestMapping("/ioError")
    public String ioError()throws IOException{
        throw new IOException("抛出IO异常");
    }
    //捕获IO异常
    @ExceptionHandler(IOException.class)
    @ResponseBody
    public Map<String, String> error(IOException ex) {
        return Collections.singletonMap("message",ex.getMessage());
    }
在注册是获取时间
 @RequestMapping("/register")
    @ResponseBody
    //@DateTimeFormat(pattern = "yyyy/MM/dd")与@InitBinder冲突
    //使用@DateTimeFormat(pattern = "yyyy/MM/dd")就不能使用@InitBinder
    public  String register( Date date) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");

        return  format.format(date);
    }


    @InitBinder
    public  void initBinder(WebDataBinder binder){
        //可以为当前controller绑定一个时间转换器
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }




在前端取值el表达式来接

<h1>错误页面</h1>

<p>${message}</p>

这样异常就会被看到了
如果所有的controller都想走这个异常就建一个关于异常的实现类,
如果所有的controller都想获取时间那么就一并写


/*
* 可以批量为多个controller统一增加异常处理和InitBinder
* */
//批量根据某些包下的所有Controller增加功能
//但所有controller必须在同一个包下
@ControllerAdvice(basePackages = {"com.lanou.demo.controller"})

//指定为某些指定的controller增加功能
@ControllerAdvice(assignableTypes = {DateController.class})

//指定为某个类所在的包下的所有controller增加功能
@ControllerAdvice(basePackageClasses= {BookController.class})

//为哪些注解所标记的controller增加功能
@ControllerAdvice(annotations = {Controller.class, RestController.class})

//与RestController意义一样
@RestControllerAdvice

public class SqlExceptionAdvice {

这样所有的方法就都能捕获异常
获取时间

    //捕获IO异常
    @ExceptionHandler(IOException.class)
    @ResponseBody
    public Map<String, String> error(IOException ex) {

        return Collections.singletonMap("message",ex.getMessage());
    }


    @InitBinder
    public  void initBinder(WebDataBinder binder){
        //可以为当前controller绑定一个时间转换器
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
}

以上是关于SpringMVC--全局异常处理的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC的全局异常处理

Spring Boot 2.X:全局异常处理

SpringMVC--全局异常处理

springMVC全局Exception异常处理SimpleMappingExceptionResolver

springmvc学习笔记(16)-异常处理器

全局异常处理