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 | 否 |
@RestController | REST API 控制器 | 同 @ResponseBody,简化配置 | 低 | Jackson | 否 |
ResponseEntity | 需要自定义状态码/头信息 | 状态码、头、数据全控制 | 中 | 无额外依赖 | 否 |
@JsonView | 需要控制序列化字段 | 粒度控制字段序列化 | 高 | Jackson 的 @JsonView | 否 |
@RequestBody + @ResponseBody | 双向 JSON 交互(如 POST/PUT) | 反序列化请求体,序列化响应体 | 中 | Jackson | 否 |
MappingJackson2JsonView | 兼容旧代码或特定视图配置 | 仅序列化模型数据,无状态/头控制 | 高 | Spring MVC + Jackson | 是 |
关键差异总结(新增 MappingJackson2JsonView)
-
控制粒度:
ResponseEntity提供最高控制(状态码、头、数据)。@JsonView用于字段级序列化控制。MappingJackson2JsonView仅能序列化模型数据,无法控制状态码或头。
-
代码简洁性:
@RestController和@ResponseBody更简洁。MappingJackson2JsonView需要额外配置视图和解析器,代码复杂度较高。
-
适用场景:
MappingJackson2JsonView:适合需要与传统视图(如 JSP)共存的场景,或在旧代码中逐步迁移时使用。- 其他方式(如
@RestController)更推荐用于现代 RESTful API 开发。
-
依赖与配置:
MappingJackson2JsonView需要显式配置视图和视图解析器,而其他方式依赖注解和消息转换器。
注意事项
MappingJackson2JsonView的局限性:- 需要通过模型传递数据,无法直接返回对象。
- 无法直接设置 HTTP 状态码或头信息,需通过
@ResponseStatus或HandlerInterceptor间接实现。
- 推荐场景:
- 在需要与传统视图(如 JSP)共存的项目中,
MappingJackson2JsonView可作为过渡方案。 - 现代项目中更推荐使用
@RestController和ResponseEntity,因其简洁性和灵活性。
- 在需要与传统视图(如 JSP)共存的项目中,
通过新增 MappingJackson2JsonView 的对比,可以更全面地理解 Spring MVC 返回 JSON 的多种方式及其适用场景。
相关文章:
Spring MVC 返回 JSON 视图的方式及对比(6种)
Spring MVC 返回 JSON 视图的方式及对比(新增 MappingJackson2JsonView) 1. 方式一:ResponseBody 注解 作用:直接返回对象,由消息转换器(如 Jackson)序列化为 JSON。 适用场景:简单…...
【Kafka基础】消费者命令行完全指南:从基础到高级消费
Kafka消费者是消息系统的关键组成部分,掌握/export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-console-consumer.sh工具的使用对于调试、测试和监控都至关重要。本文将全面介绍该工具的各种用法,帮助您高效地从Kafka消费消息。 1 基础消费模式 1.1 从最…...
在 Vue 中监听常用按键事件(回车,ESC 键,空格等)。
一、Vue 原生按键修饰符(推荐) html <!-- 常用按键监听 --> <input keyup.enter"submit" <!-- 回车键 -->keydown.esc"cancel" <!-- ESC 键 -->keyup.space"togglePlay" <!-- 空格键…...
航电系统的任务载荷集成技术要点概述!
一、任务载荷集成技术难点 1. 接口标准化与兼容性 异构设备协议冲突:不同厂商的载荷设备(如光学相机、雷达、电子战模块)采用不同的通信协议(如1553B、RS422、以太网),需设计统一的总线接口标准以支持即…...
OceanBase V4.3.5 上线全文索引功能,让数据检索更高效
近日,OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试,OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…...
Qt中的信号与槽及其自定义
信号源:哪个控件发的信号 信号的类型:用户进行不同的操作就会触发不同的信号 如点击按钮,在输入框移动光标,勾选一个复选框,选 择一个下拉框 信号的处理方式:槽(slot)----也就是函数,Qt中用con…...
【PFPGA学习】状态机思想编程HDLbitsFPGA练习
目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 4. 选型建议 三、HDLbitsFPGA练习记录(combinational logic…...
Android 中集成 Unity 工程的步骤
在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…...
Python从入门到精通全套视频教程免费
概述 📢 所有想学Python的小伙伴看过来!作为深耕编程领域的技术分享者,最新整理了一份Python从0到1的视频教程。 💡亮点 ✅ 保姆级系统路线:从环境搭建、语法精讲,到爬虫/数据分析/AI/Web全栈开发&#…...
关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践
以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…...
蓝桥杯:对字符串处理常用知识笔记
一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码(常用) #include <iostream> #in…...
实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js
文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中,Mark…...
【回眸】Linux 内核 (十四)进程间通讯 之 信号量
前言 信号量概念 信号量常用API 1.创建/获取一个信号量 2.改变信号量的值 3. 控制信号量 信号量函数调用 运行结果展示 前言 上一篇文章介绍的共享内存有局限性,如:同步与互斥问题、内存管理复杂性问题、数据结构限制问题、可移植性差问题、调试困难问题。本篇博文介…...
Redis的used_memory_peak_perc和used_memory_dataset_perc超过90%会怎么样
当Redis的used_memory_peak_perc(当前内存占历史峰值的百分比)和used_memory_dataset_perc(数据集内存占比)均超过90%时,可能引发以下问题及风险: 一、used_memory_peak_perc > 90% 的影响 内存交换风险…...
帆软fvs文件中某表格新增数据来声提醒
1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件(如 mp3 格式),并将其放置在合适的目录。 例如:%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」,输入以下 JavaScript …...
从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人
前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…...
Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。写入流程 命令执行:客户端发送写命令&am…...
深入理解 React useLayoutEffect:精准掌控 DOM 更新时机
一、useLayoutEffect 的核心定位 1.1 与 useEffect 的关键差异 特性useEffectuseLayoutEffect执行时机浏览器绘制后异步执行DOM 更新后、绘制前同步执行视觉影响可能产生布局闪烁避免布局抖动性能影响对渲染阻塞较小可能阻塞浏览器渲染适用场景数据获取、事件订阅等DOM 测量、…...
Spring Boot 3.x 中 WebClient 全面详解及示例
Spring Boot 3.x 中 WebClient 全面详解及示例 1. WebClient 简介 定义:Spring 5 引入的响应式 HTTP 客户端,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。核心特性: 支持所有 HTTP 方法&a…...
Vue3+Vite+TypeScript+Element Plus开发-06.Header响应式菜单缩展
系列文档目录 Vue3+Vite+TypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由-配置 文章目录 目录 系列文档…...
深入解析原生鸿蒙中的 RN 日志系统:从入门到精通!
全文目录: 开篇语📖 目录🎯 前言:鸿蒙日志系统究竟有多重要?🛠️ 鸿蒙 RN 日志系统的基础结构📜 1. 日志的作用⚙️ 2. 日志分类 🔧 如何在鸿蒙 RN 中使用日志系统🖋️ 1…...
下一代AI App架构:前端生成,后端消失
过去十年,Web 和 App 的开发范式基本稳定:前端负责交互体验,后端负责业务逻辑和数据管理。即使是“无服务架构”也只是将后端“拆散”而非“消失”。 但随着 AI 原生应用的兴起,特别是 大模型本地化、小模型部署、WebAssembly、L…...
$_POST 超级全局变量
$_POST 是一个超级全局变量,在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同,$_POST 允许发送大量数据,且数据不会显示在 URL 中,因此更适用于提交敏感信息,如用户登录信息、表单数据等。 使…...
开发一个环保回收小程序需要哪些功能?环保回收小程序
废品分类展示与识别 详细分类列表:清晰展示常见废品类型,如废纸(报纸、书本纸、包装纸等)、塑料(塑料瓶、塑料容器、塑料薄膜等)、金属(易拉罐、铁制品、铜制品等)、玻璃࿰…...
Debezium嵌入式连接postgresql封装服务
文章目录 1.项目结构:2.依赖:3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口(表处理抽象)7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…...
Mixed Content: The page at https://xxx was loaded over HTTPS
一、核心原因分析 Mixed Content 警告是由于 HTTPS 页面中引用了 HTTP 协议的资源(如脚本、图片、iframe 等),导致浏览器因安全策略阻止加载这些非加密内容。HTTP 资源可能被中间人攻击篡改,破坏 HTTPS 页面的整体安全性。 二、推荐解决方案 1. 强制资源升级为 HTTPS •…...
深度学习、图像算法学习记录
深度学习加速 综述文档: https://chenzomi12.github.io/02Hardware01Foundation/02ArchSlim.html winograd: https://zhuanlan.zhihu.com/p/260109670 ncnn 1.修改模型结构,优化模型内存访问次数,加速。 VGG 和 InceptionNet : …...
对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?
在Java中,对象的创建方式及其在虚拟机中的具体过程如下: 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式,直接调用类的构造方法。 MyClass obj new MyClass();反射(Reflection) 通过 Class 或 Constructor…...
Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南
在电商采购和供应链管理中,了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台,提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口,开发者可以获取工厂的详细信息,包括工厂名称、地址、联系方…...
15. git push
基本概述 git push 的作用是:把本地分支的提交推送到远程仓库。推送分支需要满足快进规则(Fast-Forward),即远程分支的最新提交必须是本地分支的直接祖先,这个是通过哈希值值进行判断的。 基本用法 1.完整格式 git…...
