ExceptionAdvice
ExceptionAdvice可以批量为多个controller统一增加异常处理和InitBinder
在ExceptionAdvice中
通过@ExceptionHandler
注解决定此方法处理哪种异常,
以及对异常进行的处理方式.
通过@InitBinder
注解给controller绑定一个时间转换器
例:
import org.springframework.format.datetime.DateFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Map;
/*
* ControllerAdvice 统一处理器
*
* 可以批量为多个controller统一增加异常处理和InitBinder
* */
// 批量为某些包下的controller增加功能
//@ControllerAdvice(basePackages = {"com.lanou.demo.controller"})
// 如果所有controller都在同一个包下
//@ControllerAdvice({"com.lanou.demo.controller"})
// 指定为某些controller增加功能
//@ControllerAdvice(assignableTypes = {DataController.class})
// 指定为某个类所在的包下的所有controller增加功能
//@ControllerAdvice(basePackageClasses = {BookController.class})
// 为哪些注解所标记的controller增加功能
@ControllerAdvice(annotations = {Controller.class, RestController.class})
// 与@RestController意义是一样的, 都是将此类中的方法加上@ResponseBody
// @RestControllerAdvice
public class SqlExceptionAdvice {
/*
* 在某个controller中使用ExceptionHandler
* 可以处理当前controller中抛出的异常
* 这个规则与controller中的其他方法和规则是一样的
*
* 这个ExceptionHandler方法可以写多个, 针对不同类型的异常做不同的处理,
* 方法的参数中可以增加一个异常对象用来获取捕获到的异常对象
* */
@ExceptionHandler(SQLException.class)
public String error(Model model, SQLException ex){
model.addAttribute("message",ex.getMessage());
return "error";
}
@ExceptionHandler(IOException.class)
@ResponseBody
public Map<String,Object> errorJson(IOException ex){
return Collections.singletonMap("message",ex.getMessage());
}
@InitBinder
public void initBinder(WebDataBinder binder){
// 可以为当前的controller绑定一个时间格式转换器
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
}
步骤:
①
创建一个advice包, 用于存放异常统一处理的类
②
在advice包中, 创建一个ExceptionAdvice
类
③
在ExceptionAdvice
类中创建方法用于对异常进行捕获与处理