前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【SpringBoot实用技巧】全局异常处理及返回增强

【SpringBoot实用技巧】全局异常处理及返回增强

原创
作者头像
blueflyming
修改2025-01-12 10:14:15
修改2025-01-12 10:14:15
1870
举报

一、从ControllerAdvice开始

ControllerAdvice是 SpringBoot 框架中的一个注解,它用于定义全局的Controller增强类,而RestControllerAdvice就是对于RestController的增强类。它是 AOP(面向切面编程)的实践,目的是将横切关注点(如异常处理、数据绑定、模型转换等)从各个控制器中分离出来,集中进行处理。它通常和ExceptionHandler结合起来一起使用。

二、全局异常处理

代码语言:java
复制
@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方法返回结果。

三、返回增强

代码语言:java
复制
@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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、从ControllerAdvice开始
  • 二、全局异常处理
  • 三、返回增强
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档