使用@RestControllerAdvice统一处理@ResponseBody的返回前端数据

news/2024/10/18 22:34:11/

一、前言

spring mvc下,在controller控制类中,标注了@ResponseBody的方法正常来说返回的是json对象,有时候还想额外在特定条件下处理一些数据(使用if),又或者是每个返回json数据的方法都可能需要做同样的处理,就需要使用@RestControllerAdvice标注方法进行统一处理。

这样做最大的好处就是不用修改原来的controller,以及可以所有controller通用,处理较为灵活。

二、前期准备,新建Result包装类

该类用于收集以及格式化输出最终数据


import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> {private int code;private String message;private T data;/*** 成功*/public static <T> Result<T> success(T data) {Result<T> result = new Result<T>();result.setCode(ResultMsgEnum.SUCCESS.getCode());result.setMessage(ResultMsgEnum.SUCCESS.getMessage());result.setData(data);return result;}/*** 失败,自己输入失败code和message*/public static <T> Result<T> error(int code, String message) {return new Result(code, message,null);}public enum ResultMsgEnum {SUCCESS(0, "成功"),FAIL(-1, "失败"),AUTH_ERROR(502, "授权失败!"),SERVER_BUSY(503, "服务器正忙,请稍后再试!"),DATABASE_OPERATION_FAILED(504, "数据库操作失败");private int code;private String message;ResultMsgEnum(int code, String message) {this.code = code;this.message = message;}public int getCode() {return this.code;}public String getMessage() {return this.message;}}
}

三、实现ResponseBodyAdvice接口

该类主要实现对控制类准备返回到前端的json数据进行统一处理


import net.sf.json.JSONObject;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.util.ArrayList;
import java.util.HashMap;@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {/*** 是否开启功能 true:开启*/@Overridepublic boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {return true;}/*** 处理返回结果*/@Overridepublic Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {//处理字符串类型数据if(o instanceof String){return JSONObject.fromObject(Result.success(o));}//返回类型是否已经封装if(o instanceof Result){return o;}//已经处理过的前端可以识别的格式数据跳过if(o instanceof ArrayList || o instanceof HashMap){return o;}return Result.success(o);}
}

四、测试

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {@ResponseBody@GetMapping(path = "/my_test")public String MyTest() {return "测试";}}

 返回的字符串

{code:0,data:"测试",msg:"成功"}

五、注意事项

1、实测,如果数据库报错,直接跳走了,不会执行到ResponseAdvice方法,建议转到统一异常处理处进行处理。


http://www.ppmy.cn/news/1103724.html

相关文章

Nginx 配置错误导致漏洞

文章目录 Nginx 配置错误导致漏洞1. 环境启动2. CRLF注入漏洞2.1 漏洞描述2.2 漏洞原理2.3 漏洞利用2.4 修复建议 3. 目录穿越漏洞3.1 漏洞描述3.2 漏洞原理3.3 漏洞利用3.4 修复建议 4. add_header被覆盖4.1 漏洞描述4.2 漏洞原理4.3 漏洞利用4.4 修复建议 Nginx 配置错误导致…

ChatGPT是否可以用于虚拟心理治疗和心理健康支持?

ChatGPT可以用于虚拟心理治疗和心理健康支持&#xff0c;但在这个领域中存在一些关键的考虑因素和限制。在探讨这些问题之前&#xff0c;让我们先了解一下ChatGPT在心理健康领域的应用潜力。 ### ChatGPT在虚拟心理治疗中的应用潜力 虚拟心理治疗是一种利用计算机程序或虚拟助…

SpringCloud-Hystrix 服务降级与熔断

接上文SpringCloud-Feign 问题描述 为了解决上述情况&#xff0c;SpringCloud提供了Hystrix熔断器组件&#xff0c;如同保险丝。服务降级则不会直接返回错误&#xff0c;而是提供一个补救措施&#xff0c;正常响应给请求者。 1.服务降级 基于借阅管理服务&#xff0c;不开启…

注意力机制讲解与代码解析

一、SEBlock(通道注意力机制) 先在H*W维度进行压缩&#xff0c;全局平均池化将每个通道平均为一个值。 &#xff08;B, C, H, W&#xff09;---- (B, C, 1, 1) 利用各channel维度的相关性计算权重 (B, C, 1, 1) --- (B, C//K, 1, 1) --- (B, C, 1, 1) --- sigmoid 与原特征相…

如何写出一篇爆款产品文案,从目标受众到市场分析!

一篇爆款产品文案意味着什么?意味着更强的种草能力&#xff0c;更高的销售转化和更强的品牌传播力。今天来分享下如何写出一篇爆款产品文案&#xff0c;从目标受众到市场分析&#xff01; 一、产品文案策略 一篇爆款产品文案&#xff0c;并不是一时兴起造就的。在撰写之前&…

uView实现全屏选项卡

// 直接复制粘贴即可使用 <template><view><view class"tabsBox"><u-tabs-swiper ref"uTabs" :list"list":current"current"change"tabsChange":is-scroll"false"></u-tabs-swiper&g…

【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

Ubuntu搭建MQTT Broker及面板发布消息、订阅主题 配置curl数据源 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash开始安装 sudo apt-get install emqx启动 sudo emqx start使用面板 根据自己的服务器是否开始了防火墙放行端口&#xff08;1808…

想在 Windows 上使用 telnet

如果你想在 Windows 上使用 telnet&#xff0c;可以按照以下步骤安装&#xff1a; 打开控制面板。点击 "程序" 或 "程序和功能"。点击 "启用或关闭 Windows 功能"。在弹出的窗口中找到 "Telnet 客户端" 并勾选它。点击 "确定&qu…