Spring Boot 统一数据返回格式 分析 和 处理

这篇具有很好参考价值的文章主要介绍了Spring Boot 统一数据返回格式 分析 和 处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

目录

实现统一数据格式

 测试 

 原因分析

 解决方案


  • 🎥 个人主页:Dikz12
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

实现统一数据格式

统⼀的数据返回格式使⽤ @ControllerAdvice ResponseBodyAdvice 的⽅式实现;
@ControllerAdvice : 表⽰控制器通知类.
比如:添加类 ResponseAdvice , 实现 ResponseBodyAdvice 接⼝, 并在类上添加
@ControllerAdvice 注解.
import com.example.demo.model.Result;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                  MediaType selectedContentType, Class selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        return Result.success(body); //返回 Result 类型的数据
    }
}

 supports⽅法: 判断是否要执⾏beforeBodyWrite⽅法. true为执⾏, false不执⾏. 通过该⽅法可以 选择哪些类或哪些⽅法的response要进⾏处理, 其他的不进⾏处理.

beforeBodyWrite⽅法:对response⽅法进⾏具体操作处理.

 测试 

 写一些不同的返回结果,看看哪些会出现问题!

import com.example.demo.model.BookInfo;
import com.example.demo.model.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/t1")
    public Integer t1() {
        return 12334;
    }

    @RequestMapping("/t2")
    public String t2() {
        return "hello";
    }

    @RequestMapping("/t3")
    public Boolean t3() {
        return true;
    }

    @RequestMapping("/t4")
    public BookInfo t4() {
        return new BookInfo();
    }

    @RequestMapping("/t5")
    public Result t5() {
        return Result.success("success");
    }
}

1.返回结果为Integer,可以正确响应.

 Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

2.返回结果为String,结果显示内部错误.

 Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

 控制台查看日志:Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

3.返回结果为Boolean,可以正常响应.

 Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

 4.返回结果为BookInfo对象,可以正常响应.

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

5.返回结果为Result,发现又进行了一次封装.

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端  

 问题:1.返回结果为String,不能正常进行处理了;2.返回结果为Result,又多进行了一次封装.

 原因分析

这时候就会非常纳闷了,为什么就处理String的时候会出错呢?就不得不去看源码分析了.

SpringMVC (也就是在初始化时) 默认会注册⼀些⾃带的 HttpMessageConverter (转换器) (从先后顺序排列分别为 ByteArrayHttpMessageConverter , StringHttpMessageConverter , SourceHttpMessageConverter , SourceHttpMessageConverter , AllEncompassingFormHttpMessageConverter )

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端
Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

 这些转换器是有先后顺序的,是用ArrayList存储的.会根据我们的返回结果挨个判断使用哪个转换器!!!

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

此时,就会发现问题就出现在 StringHttpMessageConverter.

处理的内容主要是在AbstractMessageConverterMethodProcessor 中 会有一个writeWithMessageConverters()方法.

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

通过getAdvice()拿到了beforBodyWrite 就会对body进行处理,处理完之后并没有结束(body变成了Result类型),此时,也并没有出错。会继续执行((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage).

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

 由于 StringHttpMessageConverter 重写了addDefaultHeaders⽅法, 所以会执⾏⼦类的⽅法

然⽽⼦类 StringHttpMessageConverter 的addDefaultHeaders⽅法定义接收参数为String, 此

时t为Result类型, 所以出现类型不匹配" Result cannot be cast to java.lang.String "的异常.

 解决方案

1.当返回结果为Result时,就直接返回body.

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端

2.当返回结果为String时,采用SpringBoot内置提供的Jackson来实现信息的序列化 

Spring Boot 统一数据返回格式 分析 和 处理,spring boot,java,后端文章来源地址https://www.toymoban.com/news/detail-844199.html

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                  MediaType selectedContentType, Class selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        //body 是返回的结果
        //当返回结果为Result类型时,就直接返回body
        if (body instanceof Result) {
            return body;
        }
        //返回结果为String类型, 使⽤SpringBoot内置提供的Jackson来实现信息的序列化
        if (body instanceof String) {
            return objectMapper.writeValueAsString(Result.success(body));
        }
        return Result.success(body); //返回 Result 类型的数据
    }
}

到了这里,关于Spring Boot 统一数据返回格式 分析 和 处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Spring Boot 使用Filter统一处理请求数据转换】

    Spring Boot Filter 使用场景 身份验证和授权 场景描述: 在用户访问应用程序的敏感资源之前,需要验证用户的身份并授权用户访问特定的内容。 实现方式: 使用Filter拦截请求,检查HTTP请求中的身份验证令牌(如JWT),并确定用户是否具有执行操作的权限。 日志记录和审计 场景

    2024年02月21日
    浏览(6)
  • Spring Boot进阶(45): Spring Boot 开发必备技能:如何优雅地返回统一结果包装!

            在实际的开发中,我们常常需要对 API 接口的返回结果进行统一的包装,以方便客户端的处理和异常情况的统一处理。例如,我们可能需要对 API 接口返回结果进行统一的格式处理,将所有的异常情况都转化为统一的错误类型,同时也可能需要对返回结果进行统一的加

    2024年02月07日
    浏览(14)
  • 【Spring Boot 】Spring Boot 统一功能处理

    【Spring Boot 】Spring Boot 统一功能处理

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 前言 1. Spring 拦截器 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置中 1.3 拦截器实现原理 统一访问前缀添加 (扩展) 2. 统一异常的处理 (@Co

    2024年02月09日
    浏览(9)
  • Spring Boot 统一功能处理

    Spring Boot 统一功能处理

    ✏️作者:银河罐头 📋系列专栏:JavaEE 🌲 “种一棵树最好的时间是十年前,其次是现在” Spring Boot 统⼀功能处理模块,也是 AOP 的实战环节。 Spring 中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步 骤: 创建⾃定义拦截器,实现 HandlerInterceptor 接

    2024年02月08日
    浏览(8)
  • Spring Boot 系列4 -- 统一功能处理

    Spring Boot 系列4 -- 统一功能处理

    目录 前言 1. Spring AOP 用户统⼀登录验证的问题 1.1 自定义拦截器 1.2 配置拦截器并配置拦截的规则 1.3 拦截器的原理源码分析 2. 统一异常处理 2.1 实现统一异常处理 2.2 测试统一异常处理 3. 统一的数据格式返回 3.1 统⼀数据返回格式的实现 3.2 测试统一的数据返回         S

    2024年02月14日
    浏览(11)
  • Spring Boot统一处理功能——拦截器

    Spring Boot统一处理功能——拦截器

    ⽤户登录权限的发展从之前每个⽅法中⾃⼰验证⽤户登录权限,到现在统⼀的⽤户登录验证处理,它是⼀个逐渐完善和逐渐优化的过程。 我们先来回顾⼀下最初⽤户登录验证的实现⽅法: 从上述代码可以看出,每个⽅法中都有相同的⽤户登录验证权限,它的缺点是: 1. 每个

    2024年02月13日
    浏览(11)
  • Spring MVC学习随笔-Ajax集成(JSON格式返回数据)、拦截器(MyInterceptor)、全局异常处理(GlobalExceptionResolver)

    Spring MVC学习随笔-Ajax集成(JSON格式返回数据)、拦截器(MyInterceptor)、全局异常处理(GlobalExceptionResolver)

    学习视频:【编程不良人】继spring之后快速入门springmvc,面对SpringMVC不用慌 引入相关依赖 开发控制器 日期格式修正 可以正常响应 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处

    2024年02月05日
    浏览(11)
  • Spring Boot实现统一异常处理的技术解析

    Spring Boot实现统一异常处理的技术解析

    引言 在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统

    2024年01月21日
    浏览(14)
  • 【Spring Boot】拦截器与统一功能处理

    【Spring Boot】拦截器与统一功能处理

    博主简介:想进大厂的打工人 博主主页: @xyk: 所属专栏: JavaEE进阶   上一篇文章我们讲解了Spring AOP是一个基于面向切面编程的框架,用于将某方面具体问题集中处理,通过代理对象来进行传递,但使用原生Spring AOP实现统一的拦截是非常繁琐的。而在本节,我们将使用一种

    2024年02月14日
    浏览(9)
  • spring Boot处理返回给前端Long类型精度丢失

    项目中采用springcloud Alibaba技术开发分布式系统,开发过程中采用雪花算法生成分布式Id,为Long类型,而Long类型返回给前端,会出现精度丢失问题。 接下来我们主要了解下,如何快速的处理精度丢失的问题 可以直接在返回实体属性添加\\\"@JsonSerialize(using = ToStringSerializer.class)\\\"。

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包