Spring MVC 返回 JSON 视图的方式及对比(6种)


Spring MVC 返回 JSON 视图的方式及对比(新增 MappingJackson2JsonView


1. 方式一:@ResponseBody 注解
  • 作用:直接返回对象,由消息转换器(如 Jackson)序列化为 JSON。

  • 适用场景:简单返回对象,无需自定义 HTTP 状态码或头信息。

  • 代码示例

    @Controller
    public class UserController {@GetMapping("/user/json")@ResponseBodypublic User getUser() {return new User("John", 30); // 自动序列化为 JSON}
    }
    
  • 依赖:需引入 Jackson 库(Spring Boot 默认已集成)。

  • 特点

    • 简单直接,但需显式标注 @ResponseBody
    • 无法直接控制 HTTP 状态码或头信息。

2. 方式二:@RestController 注解
  • 作用:组合 @Controller@ResponseBody,所有方法默认返回 JSON。

  • 适用场景:RESTful API 控制器,所有方法均返回 JSON。

  • 代码示例

    @RestController
    public class UserController {@GetMapping("/user/json")public User getUser() {return new User("John", 30); // 无需 @ResponseBody}
    }
    
  • 依赖:同 @ResponseBody

  • 特点

    • 简化配置,类级别标注即可。
    • 所有方法默认返回 JSON,适合 REST API。

3. 方式三:ResponseEntity 对象
  • 作用:返回包装对象,可自定义 HTTP 状态码、头信息和响应体。

  • 适用场景:需要返回特定状态码(如 404、201)或自定义头信息。

  • 代码示例

    @RestController
    public class UserController {@GetMapping("/user/json")public ResponseEntity<User> getUser() {User user = new User("John", 30);return ResponseEntity.status(HttpStatus.CREATED).header("X-Custom-Header", "value").body(user);}
    }
    
  • 依赖:无需额外依赖。

  • 特点

    • 灵活性高,可控制状态码、头和响应体。
    • 适合复杂响应场景。

4. 方式四:@JsonView 控制序列化字段
  • 作用:通过注解控制对象序列化的字段,避免暴露敏感数据。

  • 适用场景:需要根据场景选择性序列化字段(如不同 API 版本)。

  • 代码示例

    // 定义视图类
    class Views {static class Public {} static class Internal extends Public {}
    }@RestController
    public class UserController {@JsonView(Views.Public.class)@GetMapping("/user/json/public")public User getPublicUser() {return new User("John", 30); // 只序列化 @JsonView(Views.Public) 的字段}@JsonView(Views.Internal.class)@GetMapping("/user/json/internal")public User getInternalUser() {return new User("John", 30); // 序列化 Public 和 Internal 的字段}
    }// User 类字段配置
    public class User {@JsonView(Views.Public.class)private String name;@JsonView(Views.Internal.class)private int age;// ...
    }
    
  • 依赖:Jackson 的 @JsonView 注解。

  • 特点

    • 精细控制序列化字段。
    • 适合不同接口暴露不同数据。

5. 方式五:@RequestBody 反序列化 + @ResponseBody 序列化
  • 作用:处理 POST/PUT 请求的 JSON 反序列化,同时返回 JSON。

  • 适用场景:需要双向 JSON 交互(如 REST API)。

  • 代码示例

    @RestController
    public class UserController {@PostMapping("/user/save")public User saveUser(@RequestBody User user) {// 反序列化 JSON 请求体到 User 对象return user; // 序列化为 JSON 响应}
    }
    
  • 依赖:Jackson。

  • 特点

    • 支持请求体反序列化和响应体序列化。
    • 适合 RESTful CRUD 操作。

6. 新增方式六:MappingJackson2JsonView
  • 作用:通过视图解析器将模型数据转换为 JSON 格式的视图。

  • 适用场景:需要兼容旧代码或特定视图配置(如传统基于视图的 MVC 流程)。

  • 代码示例

    @Controller
    public class UserController {@GetMapping("/user/json")public String getUser(Model model) {User user = new User("John", 30);model.addAttribute("user", user); // 将数据存入模型return "jsonView"; // 视图名称}
    }
    
  • 视图配置

    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic View jsonView() {MappingJackson2JsonView view = new MappingJackson2JsonView();view.setExtractValueFromSingleKeyModel(true); // 自动提取模型中的值return view;}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {registry.enableContentNegotiation(); // 启用内容协商registry.viewResolver((s, locale) -> jsonView());}
    }
    
  • 依赖:需引入 org.springframework:spring-webmvc 和 Jackson。

  • 特点

    • 传统视图方式:依赖视图解析器和模型数据,流程与 JSP 等视图一致。
    • 配置复杂:需手动配置视图和视图解析器。
    • 灵活性低:无法直接控制 HTTP 状态码或头信息。
    • 适用场景:在需要与传统视图(如 JSP)共存时使用。

对比表格(新增 MappingJackson2JsonView

方式适用场景控制能力代码复杂度依赖是否需要视图解析器
@ResponseBody简单返回对象仅返回数据,无状态/头控制Jackson
@RestControllerREST API 控制器@ResponseBody,简化配置Jackson
ResponseEntity需要自定义状态码/头信息状态码、头、数据全控制无额外依赖
@JsonView需要控制序列化字段粒度控制字段序列化Jackson 的 @JsonView
@RequestBody + @ResponseBody双向 JSON 交互(如 POST/PUT)反序列化请求体,序列化响应体Jackson
MappingJackson2JsonView兼容旧代码或特定视图配置仅序列化模型数据,无状态/头控制Spring MVC + Jackson

关键差异总结(新增 MappingJackson2JsonView

  1. 控制粒度

    • ResponseEntity 提供最高控制(状态码、头、数据)。
    • @JsonView 用于字段级序列化控制。
    • MappingJackson2JsonView 仅能序列化模型数据,无法控制状态码或头。
  2. 代码简洁性

    • @RestController@ResponseBody 更简洁。
    • MappingJackson2JsonView 需要额外配置视图和解析器,代码复杂度较高。
  3. 适用场景

    • MappingJackson2JsonView:适合需要与传统视图(如 JSP)共存的场景,或在旧代码中逐步迁移时使用。
    • 其他方式(如 @RestController)更推荐用于现代 RESTful API 开发。
  4. 依赖与配置

    • MappingJackson2JsonView 需要显式配置视图和视图解析器,而其他方式依赖注解和消息转换器。

注意事项

  • MappingJackson2JsonView 的局限性
    • 需要通过模型传递数据,无法直接返回对象。
    • 无法直接设置 HTTP 状态码或头信息,需通过 @ResponseStatusHandlerInterceptor 间接实现。
  • 推荐场景
    • 在需要与传统视图(如 JSP)共存的项目中,MappingJackson2JsonView 可作为过渡方案。
    • 现代项目中更推荐使用 @RestControllerResponseEntity,因其简洁性和灵活性。

通过新增 MappingJackson2JsonView 的对比,可以更全面地理解 Spring MVC 返回 JSON 的多种方式及其适用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞芯微RK3568嵌入式AI项目实战:智能家居项目(二)

RK3568智能家居项目实战指南&#xff1a;从入门到精通的完整制作流程 瑞芯微RK3568作为一款高性能嵌入式处理器&#xff0c;凭借其四核Cortex-A55架构、1T算力NPU和丰富的外设接口&#xff0c;成为智能家居项目开发的理想平台。下面我将推荐几个典型的RK3568智能家居项目&…

GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147049923 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

Spring Boot 3.4.3 和 Spring Security 6.4.2 实现基于内存和 MySQL 的用户认证

在 Web 应用开发中&#xff0c;用户认证是保障系统安全的基础需求。Spring Boot 3.4.3 结合 Spring Security 6.4.2 提供了强大的安全框架支持&#xff0c;可以轻松实现基于内存或数据库的用户认证功能。本文将详细介绍如何在 Spring Boot 3.4.3 中集成 Spring Security 6.4.2&…

HOW - Axios 拦截器特性

目录 Axios 介绍拦截器特性1. 统一添加 Token&#xff08;请求拦截器&#xff09;2. 处理 401 未授权&#xff08;响应拦截器&#xff09;3. 统一处理错误信息&#xff08;响应拦截器&#xff09;4. 请求 Loading 状态管理5. 自动重试请求&#xff08;如 429 过载&#xff09;6…

JVM核心机制:类加载×字节码引擎×垃圾回收机制

&#x1f680;前言 “为什么你的Spring应用启动慢&#xff1f;为什么GC总是突然卡顿&#xff1f;答案藏在JVM的核心机制里&#xff01; 本文将用全流程图解字节码案例&#xff0c;带你穿透三大核心机制&#xff1a; 类加载&#xff1a;双亲委派如何防止恶意代码入侵&#xff…

coze生成流程图和思维导图工作流

需求&#xff1a;通过coze平台实现生成流程图和思维导图&#xff0c;要求支持文档上传 最终工作流如下&#xff1a; 入参&#xff1a; 整合用户需求文件内容的工作流&#xff1a;https://blog.csdn.net/YXWik/article/details/147040071 选择器分发&#xff0c;不同的类型走…

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…

SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作

以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的详细使用说明&#xff0c;包含代码示例和场景说明&#xff1a; 1. 什么是 TypedTuple 和 DefaultTypedTuple&#xff1f; TypedTuple<T> 接口&#xff1a; 定义了 Redis 中有序集合&#xff08;ZSet…

递归实现组合型枚举(DFS)

从 1∼n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。 输入格式 两个整数 n,m,在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行内的数升序排列&#xff0c;相邻两个数用一个空格隔开。…

CentOS 7 镜像源失效解决方案(2025年)

执行 yum update 报错&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 脚手架初始化项目生成文件的介绍

文章目录 一、介绍二、举例说明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 编译和运行A-LOAM

1.搭建文件目录和clone代码 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代码文件 2.1 由于PCL版本1.10&#xff0c;将CMakeLists.txt中的C标准改为14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…

LabVIEW 长期项目开发

LabVIEW 凭借其图形化编程的独特优势&#xff0c;在工业自动化、测试测量等领域得到了广泛应用。对于长期运行、持续迭代的 LabVIEW 项目而言&#xff0c;其开发过程涵盖架构设计、代码管理、性能优化等多个关键环节&#xff0c;每个环节都对项目的成功起着至关重要的作用。下面…

用matlab搭建一个简单的图像分类网络

文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData&#xff0c;每个数字文件夹里包含1000张对应这个数字的图片&#xff0c;图片的尺寸都是 28281 像素的&#xff0c;如下图所示…

Go 语言语法精讲:从 Java 开发者的视角全面掌握

《Go 语言语法精讲&#xff1a;从 Java 开发者的视角全面掌握》 一、引言1.1 为什么选择 Go&#xff1f;1.2 适合 Java 开发者的原因1.3 本文目标 二、Go 语言环境搭建2.1 安装 Go2.2 推荐 IDE2.3 第一个 Go 程序 三、Go 语言基础语法3.1 变量与常量3.1.1 声明变量3.1.2 常量定…

如何选择优质的安全工具柜:材质、结构与功能的考量

在工业生产和实验室环境中&#xff0c;安全工具柜是必不可少的设备。它不仅承担着工具的存储任务&#xff0c;还直接影响工作环境的安全和效率。那么&#xff0c;如何选择一个优质的安全工具柜呢&#xff1f;关键在于对材质、结构和功能的考量。 01材质&#xff1a;耐用与防腐 …

系统与网络安全------Windows系统安全(11)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 制作U启动盘 U启动程序 下载制作U启程序 Ventoy是一个制作可启动U盘的开源工具&#xff0c;只需要把ISO等类型的文件拷贝到U盘里面就可以启动了 同时支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…

【5】搭建k8s集群系列(二进制部署)之安装master节点组件(kube-controller-manager)

注&#xff1a;承接专栏上一篇文章 一、创建配置文件 cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF KUBE_CONTROLLER_MANAGER_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/op…

C#里第一个WPF程序

WPF程序对界面进行优化,但是比WINFORMS的程序要复杂很多, 并且界面UI基本上不适合拖放,所以需要比较多的时间来布局界面, 产且需要开发人员编写更多的代码。 即使如此,在面对诱人的界面表现, 随着客户对界面的需求提高,还是需要采用这样的方式来实现。 界面的样式采…