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类中创建方法用于对异常进行捕获与处理