• 在某个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"));
    }
}

通过异常处理捕获到异常


    //通过异常处理捕获到异常
    //捕获异常,在异常中处理异常,不用去判断
    @ExceptionHandler(BindException.class)
    public  String resolveBingingException(BindException ex){
       //通过异常对象获取到所有的验证错误
        FieldError fieldError = ex.getFieldError();

        return "error";
    }

posted on 2019-05-26 12:05  脑抽不要停  阅读(125)  评论(0编辑  收藏  举报