Spring MVC返回JSON視圖的六種方式及對(duì)比詳解
1. 方式一:@ResponseBody 注解
作用:直接返回對(duì)象,由消息轉(zhuǎn)換器(如 Jackson)序列化為 JSON。
適用場景:簡單返回對(duì)象,無需自定義 HTTP 狀態(tài)碼或頭信息。
代碼示例:
@Controller
public class UserController {
@GetMapping("/user/json")
@ResponseBody
public User getUser() {
return new User("John", 30); // 自動(dòng)序列化為 JSON
}
}
依賴:需引入 Jackson 庫(Spring Boot 默認(rèn)已集成)。
特點(diǎn):
- 簡單直接,但需顯式標(biāo)注
@ResponseBody。 - 無法直接控制 HTTP 狀態(tài)碼或頭信息。
2. 方式二:@RestController 注解
作用:組合 @Controller 和 @ResponseBody,所有方法默認(rèn)返回 JSON。
適用場景:RESTful API 控制器,所有方法均返回 JSON。
代碼示例:
@RestController
public class UserController {
@GetMapping("/user/json")
public User getUser() {
return new User("John", 30); // 無需 @ResponseBody
}
}
依賴:同 @ResponseBody。
特點(diǎn):
- 簡化配置,類級(jí)別標(biāo)注即可。
- 所有方法默認(rèn)返回 JSON,適合 REST API。
3. 方式三:ResponseEntity 對(duì)象
作用:返回包裝對(duì)象,可自定義 HTTP 狀態(tài)碼、頭信息和響應(yīng)體。
適用場景:需要返回特定狀態(tài)碼(如 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);
}
}
依賴:無需額外依賴。
特點(diǎn):
- 靈活性高,可控制狀態(tài)碼、頭和響應(yīng)體。
- 適合復(fù)雜響應(yīng)場景。
4. 方式四:@JsonView 控制序列化字段
作用:通過注解控制對(duì)象序列化的字段,避免暴露敏感數(shù)據(jù)。
適用場景:需要根據(jù)場景選擇性序列化字段(如不同 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 注解。
特點(diǎn):
- 精細(xì)控制序列化字段。
- 適合不同接口 暴露不同數(shù)據(jù)。
5. 方式五:@RequestBody 反序列化 + @ResponseBody 序列化
作用:處理 POST/PUT 請(qǐng)求的 JSON 反序列化,同時(shí)返回 JSON。
適用場景:需要雙向 JSON 交互(如 REST API)。
代碼示例:
@RestController
public class UserController {
@PostMapping("/user/save")
public User saveUser(@RequestBody User user) {
// 反序列化 JSON 請(qǐng)求體到 User 對(duì)象
return user; // 序列化為 JSON 響應(yīng)
}
}
依賴:Jackson。
特點(diǎn):
- 支持請(qǐng)求體反序列化和響應(yīng)體序列化。
- 適合 RESTful CRUD 操作。
6. 新增方式六:MappingJackson2JsonView
作用:通過視圖解析器將模型數(shù)據(jù)轉(zhuǎn)換為 JSON 格式的視圖。
適用場景:需要兼容舊代碼或特定視圖配置(如傳統(tǒng)基于視圖的 MVC 流程)。
代碼示例:
@Controller
public class UserController {
@GetMapping("/user/json")
public String getUser(Model model) {
User user = new User("John", 30);
model.addAttribute("user", user); // 將數(shù)據(jù)存入模型
return "jsonView"; // 視圖名稱
}
}
視圖配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public View jsonView() {
MappingJackson2JsonView view = new MappingJackson2JsonView();
view.setExtractValueFromSingleKeyModel(true); // 自動(dòng)提取模型中的值
return view;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(); // 啟用內(nèi)容協(xié)商
registry.viewResolver((s, locale) -> jsonView());
}
}
依賴:需引入 org.springframework:spring-webmvc 和 Jackson。
特點(diǎn):
- 傳統(tǒng)視圖方式:依賴視圖解析器和模型數(shù)據(jù),流程與 JSP 等視圖一致。
- 配置復(fù)雜:需手動(dòng)配置視圖和視圖解析器。
- 靈活性低:無法直接控制 HTTP 狀態(tài)碼或頭信息。
- 適用場景:在需要與傳統(tǒng)視圖(如 JSP)共存時(shí)使用。
對(duì)比表格(新增 MappingJackson2JsonView)
| 方式 | 適用場景 | 控制能力 | 代碼復(fù)雜度 | 依賴 | 是否需要視圖解析器 |
|---|---|---|---|---|---|
| @ResponseBody | 簡單返回對(duì)象 | 僅返回?cái)?shù)據(jù),無狀態(tài)/頭控制 | 低 | Jackson | 否 |
| @RestController | REST API 控制器 | 同 @ResponseBody,簡化配置 | 低 | Jackson | 否 |
| ResponseEntity | 需要自定義狀態(tài)碼/頭信息 | 狀態(tài)碼、頭、數(shù)據(jù)全控制 | 中 | 無額外依賴 | 否 |
| @JsonView | 需要控制序列化字段 | 粒度控制字段序列化 | 高 | Jackson 的 @JsonView | 否 |
| @RequestBody + @ResponseBody | 雙向 JSON 交互(如 POST/PUT) | 反序列化請(qǐng)求體,序列化響應(yīng)體 | 中 | Jackson | 否 |
| MappingJackson2JsonView | 兼容舊代碼或特定視圖配置 | 僅序列化模型數(shù)據(jù),無狀態(tài)/頭控制 | 高 | Spring MVC + Jackson | 是 |
關(guān)鍵差異總結(jié)(新增 MappingJackson2JsonView)
控制粒度:
ResponseEntity提供最高控制(狀態(tài)碼、頭、數(shù)據(jù))。@JsonView用于字段級(jí)序列化控制。MappingJackson2JsonView僅能序列化模型數(shù)據(jù),無法控制狀態(tài)碼或頭。
代碼簡潔性:
@RestController和@ResponseBody更簡潔。MappingJackson2JsonView需要額外配置視圖和解析器,代碼復(fù)雜度較高。
適用場景:
MappingJackson2JsonView:適合需要與傳統(tǒng)視圖(如 JSP)共存的場景,或在舊代碼中逐步遷移時(shí)使用。- 其他方式(如
@RestController)更推薦用于現(xiàn)代 RESTful API 開發(fā)。
依賴與配置:
MappingJackson2JsonView需要顯式配置視圖和視圖解析器,而其他方式依賴注解和消息轉(zhuǎn)換器。
注意事項(xiàng)
MappingJackson2JsonView的局限性:- 需要通過模型傳遞數(shù)據(jù),無法直接返回對(duì)象。
- 無法直接設(shè)置 HTTP 狀態(tài)碼或頭信息,需通過
@ResponseStatus或HandlerInterceptor間接實(shí)現(xiàn)。
- 推薦場景:
- 在需要與傳統(tǒng)視圖(如 JSP)共存的項(xiàng)目中,
MappingJackson2JsonView可作為過渡方案。 - 現(xiàn)代項(xiàng)目中更推薦使用
@RestController和ResponseEntity,因其簡潔性和靈活性。
- 在需要與傳統(tǒng)視圖(如 JSP)共存的項(xiàng)目中,
通過新增 MappingJackson2JsonView 的對(duì)比,可以更全面地理解 Spring MVC 返回 JSON 的多種方式及其適用場景。
以上就是Spring MVC返回JSON視圖的六種方式及對(duì)比詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC返回JSON視圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java.net.http.HttpClient使用示例解析
這篇文章主要為大家介紹了java.net.http.HttpClient使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
SpringBoot集成Druid監(jiān)控頁面最小化配置操作
這篇文章主要介紹了SpringBoot集成Druid監(jiān)控頁面最小化配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
關(guān)于Android觸摸事件分發(fā)的原理詳析
觸摸事件分發(fā)機(jī)制一直以來都是Android中比較重要的一大塊,自定義view,各種復(fù)雜的自定義手勢交互都與觸摸事件分發(fā)機(jī)制關(guān)系密,下面這篇文章主要給大家介紹了關(guān)于Android觸摸事件分發(fā)原理的相關(guān)資料,需要的朋友可以參考下2022-01-01
基于springboot實(shí)現(xiàn)整合shiro實(shí)現(xiàn)登錄認(rèn)證以及授權(quán)過程解析
這篇文章主要介紹了基于springboot實(shí)現(xiàn)整合shiro實(shí)現(xiàn)登錄認(rèn)證以及授權(quán)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn)
這篇文章主要給大家介紹了關(guān)于使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn),在插入一條數(shù)據(jù)之后需要返回它的自增主鍵id,因?yàn)椴迦氲膶?shí)體類數(shù)據(jù)id為空,后面的邏輯還需要這個(gè)id,需要的朋友可以參考下2023-09-09

