Spring注解-@RestControllerAdvice
@RestControllerAdvice注解是什么
- @RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成。
- 而@ControllerAdvice又是由@Component组合。
- 使用@RestControllerAdvice可用自定义一个异常处理类。一般配合@ExceptionHandler、@InitBinder、@ModelAttribute注解使用。
- @RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
@ExceptionHandler、#InitBinder、@ModelAttribute注解
- @ExceptionHandler,标记在被@RestContrllerAdvice类中的方法中,用处理特定的异常,如@ExceptionHander(MyException.class),处理MyException异常。
- @InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中
- @ModelAttribute:本来作用是绑定键值对到Model中,当与@RestControllerAdvice配合使用时,可以让全局的@RequestMapping都能获得在此处设置的键值对.
案例
使用@RestControllerAdvice注解配合@ExceptionHandler实现自定义异常处理器
- 自定义异常枚举类
@Getter
public enum ExceptionEnum {ERROR_APIKEY(-1,"非法的apiKey"),IP_NOT_WHIT(-2,"手机号不正确"),//…… ;private Integer code;private String msg;ExceptionEnum(Integer code, String msg) {this.code = code;this.msg = msg;}
}
- 自定义异常类
@Getter
public class ApiException extends RuntimeException{/** 异常码 */private Integer code;public ApiException(Integer code,String message) {super(message);this.code = code;}public ApiException(ExceptionEnum exceptionEnum) {super(exceptionEnum.getMsg());this.code = exceptionEnum.getCode();}
}
- 自定义Controller类的返回参数类
@Data
public class ResultVo {/** 状态码,0-成功,-1非法apiKey, -2手机号不正确*/private Integer code;/** 返回信息*/private String msg;//……
}
- 自定义异常处理类
@RestControllerAdvice
public class ApiExceptionHandler {/** 处理 ApiException异常 */@ExceptionHandler(ApiException.class)public ResultVo apiException(ApiException e){return R.error(e);}
}
- 抛出ApiException
@RestController
@RequestMapping("sms")
@Slf4j
@RefreshScope
public class SMSController {@PostMapping(value = "/single_send",produces = "application/json;charset=utf-8")public ResultVo test(@RequestBody @Validated SingleSendForm singleSendForm){throw new ApiException(ExceptionEnum.ERROR_APIKEY);return R.ok();}}
- 接口返回
- 如果没有自定义异常处理返回结果
{"timestamp": "2024-06-22T09:03:10.766+00:00","status": 500,"error": "Internal Server Error","message": "","path": "/sms/single_send"
}
- 自定义异常后返回结果
{"code": -1,"msg": "非法的apiKey"
}