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

news2025/4/18 1:03:27

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


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

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

  • 代码示例

    @Controller
    public class UserController {
        @GetMapping("/user/json")
        @ResponseBody
        public 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 {
        @Bean
        public View jsonView() {
            MappingJackson2JsonView view = new MappingJackson2JsonView();
            view.setExtractValueFromSingleKeyModel(true); // 自动提取模型中的值
            return view;
        }
    
        @Override
        public 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.coloradmin.cn/o/2332153.html

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

相关文章

航电系统的任务载荷集成技术要点概述!

一、任务载荷集成技术难点 1. 接口标准化与兼容性 异构设备协议冲突&#xff1a;不同厂商的载荷设备&#xff08;如光学相机、雷达、电子战模块&#xff09;采用不同的通信协议&#xff08;如1553B、RS422、以太网&#xff09;&#xff0c;需设计统一的总线接口标准以支持即…

OceanBase V4.3.5 上线全文索引功能,让数据检索更高效

近日&#xff0c;OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试&#xff0c;OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…

Qt中的信号与槽及其自定义

信号源&#xff1a;哪个控件发的信号 信号的类型&#xff1a;用户进行不同的操作就会触发不同的信号 如点击按钮&#xff0c;在输入框移动光标&#xff0c;勾选一个复选框&#xff0c;选 择一个下拉框 信号的处理方式&#xff1a;槽(slot)----也就是函数&#xff0c;Qt中用con…

【PFPGA学习】状态机思想编程HDLbitsFPGA练习

目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 &#xff14;. 选型建议 三、HDLbitsFPGA练习记录&#xff08;combinational logic…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

Python从入门到精通全套视频教程免费

概述 &#x1f4e2; 所有想学Python的小伙伴看过来&#xff01;作为深耕编程领域的技术分享者&#xff0c;最新整理了一份Python从0到1的视频教程。 &#x1f4a1;亮点 ✅ 保姆级系统路线&#xff1a;从环境搭建、语法精讲&#xff0c;到爬虫/数据分析/AI/Web全栈开发&#…

蓝桥杯:对字符串处理常用知识笔记

一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码&#xff08;常用&#xff09; #include <iostream> #in…

实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js

文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中&#xff0c;Mark…

帆软fvs文件中某表格新增数据来声提醒

1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件&#xff08;如 mp3 格式&#xff09;&#xff0c;并将其放置在合适的目录。 例如&#xff1a;%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」&#xff0c;输入以下 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…

$_POST 超级全局变量

$_POST 是一个超级全局变量&#xff0c;在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同&#xff0c;$_POST 允许发送大量数据&#xff0c;且数据不会显示在 URL 中&#xff0c;因此更适用于提交敏感信息&#xff0c;如用户登录信息、表单数据等。 使…

开发一个环保回收小程序需要哪些功能?环保回收小程序

废品分类展示与识别 详细分类列表&#xff1a;清晰展示常见废品类型&#xff0c;如废纸&#xff08;报纸、书本纸、包装纸等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金属&#xff08;易拉罐、铁制品、铜制品等&#xff09;、玻璃&#xff0…

Debezium嵌入式连接postgresql封装服务

文章目录 1.项目结构&#xff1a;2.依赖&#xff1a;3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口&#xff08;表处理抽象&#xff09;7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…

Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南

在电商采购和供应链管理中&#xff0c;了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台&#xff0c;提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口&#xff0c;开发者可以获取工厂的详细信息&#xff0c;包括工厂名称、地址、联系方…

Rust所有权详解

文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理&#xff0c;手动申请和释放&#xff0c;即便有了智能指针&#xff0c;对于效率的影…

CExercise_07_1指针和数组_2数组元素的逆序数组逆序(指针版 reverse_by_ptr 和下标版 reverse_arr)

题目&#xff1a; 数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。 关键点 arr[i] arr[len - 1 - i]; arr[0]arr[len-1]; 如果数组序列是偶数,则调换最中间一对为止;若为奇数,则单出一个不用反转. 思想就是长度取一半 eg:8/2, 9/24.5,反转一半,到5时固定…

框架PasteForm实际开发案例,换个口味显示数据,支持echarts,只需要标记几个特性即可在管理端显示(2)

PasteForm框架的主要思想就是对Dto进行标记特性,然后管理端的页面就会以不一样的UI呈现 使用PasteForm框架开发,让你免去开发管理端的烦恼,你只需要专注于业务端和用户端! 在管理端中,如果说表格是基本的显示方式,那么图表chart就是一个锦上添花的体现! 如果一个项目拥…

Starrocks的Bitmap索引和Bloom filter索引以及全局字典

写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。 Starrocks Bitmap索引 原理&#xff1a; Bitmap 索引是一种使用 bitmap 的特殊数据库索引。bitmap 即为一个 bit 数组&#xff0c;一个 bit 的取值有两种&#xff1a;0 或 1。 每一个 bit 对应数据表中的一行&…

QML面试笔记--UI设计篇05容器控件

1. QML中容器控件全解&#xff1a;构建灵活界面的基石 1.1. Item&#xff08;万物容器&#xff09;1.2. Rectangle&#xff08;视觉容器&#xff09;1.3. ListView&#xff08;动态列表容器&#xff09;1.4. Frame&#xff08;表单容器&#xff09;1.5. SwipeView&#xff08;页…

VSCode运行,各类操作缓慢,如何清理

VSCode写代码&#xff0c;随着项目逐步进展&#xff0c;代码量在增加&#xff0c;依赖的第三方头文件也在增加&#xff0c; 先是发现代码提示的速度变慢&#xff0c; 后来格式化代码速度太慢 然后c/c代码的语法检查有时候压根就失败&#xff0c;来个错误提示 还有source contro…