前言
@RestControllerAdvice是Controller的增强 常用于全局异常的捕获处理 和请求参数的增强
继承@ControllerAdvice、@ResponseBody等注解 它返回的数据是JSON格式的。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
//可以指定一个或多个包、类,这些包及其子包下的所有Controller都被该@ControllerAdvice管理。
//可以指定异常处理要扫描的包
//@RestControllerAdvice("com.hyl.cnt")、
//@RestControllerAdvice(basePackages={"org.my.pkg"}
@AliasFor("basePackages")
String[] value() default {};
//这个和上面作用一样
@AliasFor("value")
String[] basePackages() default {};
//指定一个或多个 Controller 类,这些类所属的包及其子包下的所有 Controller
//@RestControllerAdvice (basePackageClasses = {MyController.class})
Class<?>[] basePackageClasses() default {};
//指定一个或多个 Controller 类
//@RestControllerAdvice (assignableTypes = {MyController.class})
Class<?>[] assignableTypes() default {};
//指定一个或多个 被这些注解所标记的 Controller 会被管理
//@RestControllerAdvice (annotations = {RestController.class})
Class<? extends Annotation>[] annotations() default {};
}
//当应用多个选择器时,应用OR逻辑 - 意味着所选的控制器应匹配至少一个选择器。
全局异常捕获案例
@RestControllerAdvice(assignableTypes = {MyController.class})
@Slf4j
public class GlobalExceptionHandler {
/**
* ExceptionHandler 处理 Exception 异常
* HttpServletRequest httpServletRequest 请求request
* Exception e 异常对象
*/
@ExceptionHandler(value = Exception.class)
public String exceptionHandler(HttpServletRequest httpServletRequest, Exception e) {
log.error("GlobalExceptionHandler 服务错误");
return "GlobalExceptionHandler 服务错误";
}
/**
* 处理运行异常 RunctimeException
*/
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntimeException(RuntimeException ex) {
log.error(ex);
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
请求前初始化绑定,给请求中添加请求参数
@Slf4j
@RestControllerAdvice
public class MyHandler {
/**
* 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
*
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
log.info("初始化数据绑定器");
log.info(binder.getFieldDefaultPrefix());
log.info(binder.getFieldMarkerPrefix());
}
/**
* 把值绑定到Model中,使全局@RequestMapping可以获取到该值
* @param model
*/
@ModelAttribute
public void addAttributes(Model model) {
log.info("添加name参数");
model.addAttribute("name", "hyl");
}
}