ControllerAdvice是 SpringBoot 框架中的一个注解,它用于定义全局的Controller增强类,而RestControllerAdvice就是对于RestController的增强类。它是 AOP(面向切面编程)的实践,目的是将横切关注点(如异常处理、数据绑定、模型转换等)从各个控制器中分离出来,集中进行处理。它通常和ExceptionHandler结合起来一起使用。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {ApiException.class})
public Result<Object> apiExceptionHandler(ApiException e) {
return Result.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(value = {RuntimeException.class})
public Result<Object> runtimeExceptionHandler(RuntimeException e) {
return Result.error(e.getMessage());
}
}
这段代码定义了一个全局的RestController增强,它主要用于异常处理。ExceptionHandler注解表示当捕捉到指定value的异常类时,执行函数体。在本段代码中,首先匹配了ApiException异常类,如果匹配成功,则执行apiExceptionHandler方法,来返回结果;否则则会匹配到RuntimeException异常类,执行runtimeExceptionHandler方法返回结果。
@ControllerAdvice
public class WebResponseBodyAdvice<T> implements ResponseBodyAdvice<T> {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
if (methodParameter.getMethod() != null) {
Annotation[] annotations = methodParameter.getMethod().getDeclaringClass().getAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof RestController) {
return true;
}
}
}
return false;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass,
ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (o instanceof Result)
return o;
if (o instanceof String) {
return JSONObject.toJSONString(Result.ok(o));
}
return Result.ok(o);
}
}
这段代码顶一个一个返回增强,其中support方法定义了什么条件才能进行增强,beforeBodyWrite方法定义了如何进行增强。在supports方法中,通过获取注解的函数来获取是否被RestController注解,如果是则进行增强;在beforeBodyWrite则是匹配原函数的返回结果,如果是Result对象则直接返回,否则将它构造成Result对象进行返回,需要注意的是,如果原来的返回对象是String,则需要单独处理成Result对象的Json String返回。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。