springboot返回统一的标准格式

定义注解

package com.yaoling.annotation;

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseResult { }

controller层引入注解

@RestController
@RequestMapping(value = "/material/api/v1/laboratoryWarehouse/")
@ResponseResult //引入注解
public class LaboratoryWarehouseController {
....

统一返回Response类编写

枚举类

public enum ResultCode  {
SUCCESS(200, "成功"),
FAILED(500, "失败"),
UNAUTHORIZED(401, "暂未登录或token已经过期"),
FORBIDDEN(403, "没有相关权限"); private int code;
private String message; ResultCode(int code,String message) {
this.code = code;
this.message = message;
} public int getCode() {
return code;
} public String getMessage() {
return message;
}
}

返回类

@Data
public class Response<T> {
private int code;
private String description;
private T result;
private String expandMsg; public Response(int code, String description, T data) {
this.code = code;
this.description = description;
this.result = data;
} public static <T> Response<T> success(String description) {
return new Response<T>(ResultCode.SUCCESS.getCode(), description, null);
} public static <T> Response<T> success(T data) {
return new Response<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
} public static <T> Response<T> success(T data, String description) {
return new Response<T>(ResultCode.SUCCESS.getCode(), description, data);
} public static <T> Response<T> forbidden(T data) {
return new Response<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
} public static <T> Response<T> error(T data) {
return new Response<T>(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMessage(), data);
} public static <T> Response<T> error(String description) {
return new Response<T>(ResultCode.FAILED.getCode(), description, null);
} public static <T> Response<T> error(String description, T data) {
return new Response<T>(ResultCode.FAILED.getCode(), description, data);
}
}

定义拦截器

执行链组件

@Component
public class ResponseResultInterceptor implements HandlerInterceptor { public static final String RESPONSE_RESULT_ANN = "RESPONSE-RESULT-ANN"; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (handler instanceof HandlerMethod) {
Class<?> beanType = ((HandlerMethod) handler).getBeanType();
Method method = ((HandlerMethod) handler).getMethod(); //方法或class上有ResponseResult注解的,request设置属性
if (beanType.isAnnotationPresent(ResponseResult.class)) {
request.setAttribute(RESPONSE_RESULT_ANN, beanType.getAnnotation(ResponseResult.class));
} else if (method.isAnnotationPresent(ResponseResult.class)) {
request.setAttribute(RESPONSE_RESULT_ANN, method.getAnnotation(ResponseResult.class));
} }
return true;
} }

自定义拦截器

@Configuration
public class WebAppConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
ResponseResultInterceptor interceptor = new ResponseResultInterceptor();
registry.addInterceptor(interceptor);
WebMvcConfigurer.super.addInterceptors(registry);
}
}

定义controller切面

@ControllerAdvice
public class ResponseResultHandler<T> implements ResponseBodyAdvice<Object> {
public static final String RESPONSE_RESULT_ANN = "RESPONSE-RESULT-ANN"; @Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (sra == null) {
return false;
}
//判断是否有RESPONSE_RESULT_ANN属性==>判断是否有引入ResponseResult注解
HttpServletRequest sraRequest = sra.getRequest();
ResponseResult responseResult = (ResponseResult) sraRequest.getAttribute(RESPONSE_RESULT_ANN);
return responseResult != null;
} @SneakyThrows
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
//返回body中有页码
if (body instanceof PageInfoVo) {
List<T> data = (List<T>) ((PageInfoVo<T>) body).getData();
int size = data.size(); //list中有数据
if (size > 0) {
ObjectMapper objectMapper = new ObjectMapper();
List<Object> snakeList = new ArrayList<>(size); for (T datum : data) {
//object转JsonNode
JsonNode jsonNode = objectMapper.readTree(objectMapper.writeValueAsString(datum));
//JsonNode的key转为蛇形
JsonNode snakeJsonNode = JsonUtils.convertKeysToSnake(jsonNode); snakeList.add(snakeJsonNode);
} ((PageInfoVo<T>) body).setData((List<? extends T>) snakeList);
} return Response.success(body);
} //判断返回的body数据
if (body instanceof Response) {
return body;
} else if (body instanceof String) {
return Response.success(body);
}
return Response.success(body);
}
}

测试

接口

public class LaboratoryWarehouseController {
@Autowired
private LaboratoryWarehouseService service; @RequestMapping(method = RequestMethod.GET, value = "query")
public PageInfoVo<BaseMaterVo> query(@RequestBody BaseMaterialDto baseMaterialDto) {
//此时的返回类型为PageInfoVo<BaseMaterVo>
return service.query(baseMaterialDto);
}
}

接口结果

{
"code": 200,
"description": "成功",
"result": {
"pagination": {
"total": 1,
"totalPage": 1,
"page": 1,
"pageSize": 20
},
"data": [
{
"id": "573024997631591394",
"name": "环辛烷",
"code": "WL0028958",
"batch_no": "20231206-001",
"laboratory": null,
"preparation_date": null,
"warehouse_entry_time": "2023-12-06 00:00:00"
}
]
},
"expandMsg": null
}

springboot封装统一返回的更多相关文章

  1. (三)SpringBoot定义统一返回result对象

    一:定义响应码枚举 package com.example.demo.core.ret; /** * @Description: 响应码枚举,参考HTTP状态码的语义 * @author * @dat ...

  2. 统一返回对象封装和统一异常捕获封装springboot starter

    好久没有更新文章了,高龄开发没什么技术,去了外包公司后没怎么更新文章了.今天分享下统一处理starter,相信开发web系统的时候都是会涉及到前后端的交互,而后端返回数据的时候一般都会统一封装一个返回 ...

  3. springboot之全局处理统一返回

    springboot之全局处理统一返回 简介 在REST风格的开发中,避免通常会告知前台返回是否成功以及状态码等信息.这里我们通常返回的时候做一次util的包装处理工作,如:Result类似的类,里面 ...

  4. SpringBoot异常处理统一封装我来做-使用篇

    SpringBoot异常处理统一封装我来做-使用篇 简介 重复功能我来写.在 SpringBoot 项目里都有全局异常处理以及返回包装等,返回前端是带上succ.code.msg.data等字段.单个 ...

  5. SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!

    大家好,我是飘渺. 今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常. 首先我们来看看为什么要返回统一的标准格式? 为什么要对Sp ...

  6. SpringBoot 如何统一后端返回格式

    在前后端分离的项目中后端返回的格式一定要友好,不然会对前端的开发人员带来很多的工作量.那么SpringBoot如何做到统一的后端返回格式呢?今天我们一起来看看. 为什么要对SpringBoot返回统一 ...

  7. springboot统一返回json数据格式并配置系统异常拦截

    本文链接:https://blog.csdn.net/syystx/article/details/82870217通常进行前后端分离开发时我们需要定义统一的json数据交互格式并对系统未处理异常进行 ...

  8. Spring Boot API 统一返回格式封装

    今天给大家带来的是Spring Boot API 统一返回格式封装,我们在做项目的时候API 接口返回是需要统一格式的,只有这样前端的同学才可对接口返回的数据做统一处理,也可以使前后端分离 模式的开发 ...

  9. Java封装接口统一返回数据模板

    现在大多数都使用前后端分离开发模式,前端通过Ajax请求访问后台服务器,后台返回JSON数据供前端操作,这里编写一个统一返回数据模板类,方便日后操作 public class R extends Ha ...

  10. spring boot 2 全局统一返回RESTful风格数据、统一异常处理

    全局统一返回RESTful风格数据,主要是实现ResponseBodyAdvice接口的方法,对返回值在输出之前进行修改.使用注解@RestControllerAdvice拦截异常并统一处理. 开发环 ...

随机推荐

  1. Centos7——防火墙(Firewall)命令

    centos防火墙根据系统大致有2种,一种是centos6时代的iptables:一种是centos7时代的firewalld: CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5 ...

  2. electron入门之通知Notification(二)

    electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...

  3. Java播放MP3播放音频

    Java播放MP3播放音频 下面我演示用jdk自带包.框架等分别展示播放mp3.等music 一.使用javafx包 AudioClip 注意jdk11以上剥离了javafx public stati ...

  4. Zookeeper 的基本使用

    维基百科对 Zookeeper 的介绍如下所示: Apache ZooKeeper是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务.同步服务和命名注册 ZooKe ...

  5. vue获取公网ip

    <template> <div> <div>Your Public IP: {{publicIP}}</div> </div> </t ...

  6. DTT年度收官圆桌π,华为云8位技术专家的年末盘点

    摘要:收下这份DTT年度收官圆桌π总结,在新的一年心想事成,技术上更上一层楼. 本文分享自华为云社区<DTT年度收官圆桌π,华为云8位技术专家的年末盘点>,作者:华为云社区精选 . 在20 ...

  7. JS的深浅复制,原来如此!

    摘要:之所以会出现深浅拷贝的问题,实质上是由于JS对基本类型和引用类型的处理不同. 本文分享自华为云社区<js的深浅复制,一看就明白>,作者: 鑫2020. 浅复制的意思 浅复制是仅仅对数 ...

  8. 10个问题让你快速避开java中的jdbc常见坑

    摘要:JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范. 本文分享自华为云社区<1 ...

  9. Java实现压缩文件浅谈

    背景: 在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作.主要涉及的类有ZipOutputStream.ZipEntry.ZipInputStream和Infla ...

  10. DevEco中被忽略的实用功能

    近期,我一直在业余时间研究纯血鸿蒙(HarmonyOS)App的开发,所使用的IDE是华为官方的DevEco Studio 3.1.1. 随着使用时间的增长,我发现了几个特别容易被忽略,但又特别实用的 ...