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
类中创建方法用于对异常进行捕获与处理
全局异常处理机制
package com.jt.advice;
import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* Spring为了整合全局异常的处理 开发了如下的注解
* 1.@RestControllerAdvice //定义全局异常的处理类 返回值JSON串
* 2.@ExceptionHandler 标识拦截的异常的类型,如果类型匹配,则执行方法
*/
@RestControllerAdvice
public class MyExceptionAdvice {
//写法:1.运行时异常(通用) 2.自定义异常信息 3.拦截所有异常Exception.class
@ExceptionHandler(RuntimeException.class)
public Object exception(Exception e){
e.printStackTrace(); //输出异常信息
//需求: 如果遇到异常,应该提示用户201/失败信息.
return SysResult.fail();
}
}