ResponseBodyAdvice还可以用于处理控制器抛出异常时的响应格式

简介: 除了对控制器返回数据进行统一的处理外,ResponseBodyAdvice还可以用于处理控制器抛出异常时的响应格式。以下是一个示例,实现了对异常的包装,添加了响应码和响应消息:

除了对控制器返回数据进行统一的处理外,ResponseBodyAdvice还可以用于处理控制器抛出异常时的响应格式。

以下是一个示例,实现了对异常的包装,添加了响应码和响应消息:

@ControllerAdvice
public class ExceptionWrapper implements ResponseBodyAdvice<Object> {
   

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
   
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
   
        if (body instanceof ResponseWrapper) {
   
            // 如果已经是包装类,直接返回
            return body;
        }
        // 否则进行包装
        ResponseWrapper<Object> responseWrapper = new ResponseWrapper<>();
        if (body instanceof BusinessException) {
   
            // 将业务异常的状态码和消息拷贝到responseWrapper中
            BusinessException businessException = (BusinessException) body;
            responseWrapper.setCode(businessException.getCode());
            responseWrapper.setMessage(businessException.getMessage());
        } else {
   
            // 将服务器异常状态码和消息拷贝到responseWrapper中
            responseWrapper.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
            responseWrapper.setMessage(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
        }
        responseWrapper.setData(null);
        return responseWrapper;
    }

    // 异常处理
    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<ResponseWrapper> handleBusinessException(BusinessException e) {
   
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e);
    }
}

在上述示例中,我们实现了ResponseBodyAdvice接口,并在类上使用@ControllerAdvice注解,表示该类也会拦截所有Controller的响应。同时我们也定义了一个异常处理器,处理控制器抛出的BusinessException异常。

在beforeBodyWrite方法中,我们判断了返回的数据是否已经是一个包装类,如果是,则直接返回,否则包装成ResponseWrapper类进行返回。如果抛出的异常是BusinessException,则将其状态码和消息拷贝到responseWrapper中;否则将服务器异常的状态码和消息拷贝到responseWrapper中。

通过这种方式,我们可以统一处理控制器抛出的异常,使客户端可以统一解析异常并进行处理。

相关文章
|
监控 Java 数据处理
【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解
【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解
|
开发工具 git
【git 实用指南】git 修复错误提交,版本回退
【git 实用指南】git 修复错误提交,版本回退
214 1
QT+OpenGL鼠标操作和模型控制
光线追踪法 从鼠标投射 3D 射线, 通过摄像机,进入场景,然后检查该光线是否与某个对象相交。
545 0
|
监控 Java 测试技术
阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
174486 106
|
8月前
|
人工智能 缓存 监控
终于有人说清楚AI开发的全流程了!
本文详述了AI需求开发流程各阶段的关键步骤和最佳实践,包括需求调研、模型选型、提示词优化、性能测试以及上线后的监控和反馈,旨在帮助开发者构建高效、可靠的AI应用。
|
12月前
|
存储 SQL NoSQL
数据库技术深度探索:从关系型到NoSQL的演变
【10月更文挑战第21天】数据库技术深度探索:从关系型到NoSQL的演变
263 1
|
12月前
|
缓存 监控 前端开发
怎样提升 Flutter 应用的性能
【10月更文挑战第4天】
|
算法 前端开发 JavaScript
SpringBoot+随机盐值+双重MD5实现加密登录
SpringBoot+随机盐值+双重MD5实现加密登录
1079 1
|
算法 5G 数据安全/隐私保护
SCM信道模型和SCME信道模型的matlab特性仿真,对比空间相关性,时间相关性,频率相关性
该简介展示了使用MATLAB 2022a进行无线通信信道仿真的结果,仿真表明信道的时间、频率和空间相关性随间隔增加而减弱,并且宏小区与微小区间的相关性相似。文中介绍了SCM和SCME模型,分别用于WCDMA和LTE/5G系统仿真,重点在于其空间、时间和频率相关性的建模。SCME模型在SCM的基础上进行了扩展,提供了更精细的参数化,增强了模型的真实性和复杂度。最后附上了MATLAB核心程序,用于计算不同天线间距下的空间互相关性。
299 0
|
缓存 前端开发 小程序
SpringBoot+uniapp实现网页授权获取用户基本信息
本文详细介绍了微信网页授权登录的实现过程,作者原本计划在一个项目中使用该功能,但由于公众号未认证而放弃。文中分享了如何通过测试公众号实现网页授权并获取用户基本信息,包括配置授权回调域名、获取access_token及刷新等步骤。适合初次接触或希望回顾此流程的读者。此外,还提供了常见错误解决方案,强调了正确配置回调域名的重要性,并提醒避免重复使用已失效的code。通过本文,读者可以更好地理解和应用微信网页授权。
289 0
SpringBoot+uniapp实现网页授权获取用户基本信息