返回json & 通用返回值設計 | SpringMVC系列第8篇

目前比較流行前後端分離,後端只需為前端提供 restfull 介面,所有的介面都返回 json 格式的資料,前端接收到 json 資料之後再進行處理。

那麼在 SpringMVC 中如何向前端輸出 json 格式的資料呢?

常見的有 3 種方式,我們來了解下。

1、方式 1:方法上新增@ResponseBody

需求

使用 springmvc 提供一個介面,以 json 格式輸出使用者列表。

3 個步驟

step1:maven 配置引入 jackjson

jackjson 用於將 java 物件轉換為 json 格式的字串,也可以將 json 格式的字串轉換為 java 物件

我們的介面需要將 java 物件轉換為 json 格式的字串輸出到客戶端,所以我們需要用到這個包。

    com。fasterxml。jackson。coregroupId>    jackson-coreartifactId>    2。11。4version>dependency>    com。fasterxml。jackson。coregroupId>    jackson-databindartifactId>    2。11。4version>dependency>

step2:springmvc 配置檔案中添加註解驅動

添加了這段程式碼之後,springmvc 就被賦予了將 java 物件轉換為 json 格式字串輸出到客戶端的能力。

step3:處理器的方法上新增@ResponseBody 註解

如下程式碼,我們希望 list()方法用於向客戶端以 json 格式輸出使用者列表。

此時只需要在這個方法上面新增一個

@ResponseBody

註解,SpringMVC 發現這個方法上有

@ResponseBody

這個註解,並且方法返回值是一個普通的 java 物件的時候,會將方法的返回值使用 jackson 轉換為 json 格式的字串,然後輸出到客戶端。

@Controllerpublic class UserController {    /**     * 使用者列表(使用者id->使用者資訊)     */    Map userDtoMap = new ConcurrentHashMap<>();    {        userDtoMap。put(1L, new UserDto(1L, “路人”, 30));        userDtoMap。put(2L, new UserDto(2L, “張三”, 20));        userDtoMap。put(3L, new UserDto(3L, “李四”, 18));    }    @GetMapping(“/user/list。do”)    @ResponseBody    public Collection list() {        return this。userDtoMap。values();    }}

驗證效果

谷歌瀏覽器中訪問下這個介面

返回json & 通用返回值設計 | SpringMVC系列第8篇

F12 看一下介面的響應頭,如下,可以看到 response 的

Content-Type

的值為

application/json;chatset=UTF-8

,這個說明響應結果的內容格式是 json 格式。

返回json & 通用返回值設計 | SpringMVC系列第8篇

2、方式 2:Controller 上新增@ResponseBody 註解

當我們 controller 中方法很多的時候,且所有方法都要求返回 json 格式的資料的時候,如果按照方式 1,我們需要在每個方法上都要新增

@ResponseBody

註解,此時有更簡單的方法,將所有方法上的

@ResponseBody

註解都去掉,然後在 Controller 上加上

@ResponseBody

就可以了。

比如下面這段程式碼,我們可以將 2 個方法上面的

@ResponseBody

幹掉,然後在類上新增

@ResponseBody

註解就可以了。

@Controllerpublic class UserController {    Map userDtoMap = new ConcurrentHashMap<>();    {        userDtoMap。put(1L, new UserDto(1L, “路人”, 30));        userDtoMap。put(2L, new UserDto(2L, “張三”, 20));        userDtoMap。put(3L, new UserDto(3L, “李四”, 18));    }    @GetMapping(“/user/list。do”)    @ResponseBody    public Collection list() {        return this。userDtoMap。values();    }    @GetMapping(“/user/{id}。do”)    @ResponseBody    public UserDto user(@PathVariable(“id”) Long id) {        return this。userDtoMap。get(id);    }}

調整之後如下

@Controller@ResponseBodypublic class UserController {    Map userDtoMap = new ConcurrentHashMap<>();    {        userDtoMap。put(1L, new UserDto(1L, “路人”, 30));        userDtoMap。put(2L, new UserDto(2L, “張三”, 20));        userDtoMap。put(3L, new UserDto(3L, “李四”, 18));    }    @GetMapping(“/user/list。do”)    public Collection list() {        return this。userDtoMap。values();    }    @GetMapping(“/user/{id}。do”)    public UserDto user(@PathVariable(“id”) Long id) {        return this。userDtoMap。get(id);    }}

3、方式 3:Controllers 上使用@RestController

我們回頭再看下上面程式碼,如下圖,UserController 上有 2 個註解

@Controller

@ResponseBody

,而 SpringMVC 提供了一個更好的註解

@RestController

,相當於這 2 個註解的合體,所以可以用來替換這 2 個註解。

返回json & 通用返回值設計 | SpringMVC系列第8篇

返回json & 通用返回值設計 | SpringMVC系列第8篇

返回json & 通用返回值設計 | SpringMVC系列第8篇

4、restfull 介面通用返回值

客戶端呼叫伺服器端介面的時候,介面有可能會發生異常,這些異常資訊需要返回給呼叫者,通常我們會為錯誤定義錯誤碼以及提示資訊。

一般我們會定義通用的返回值型別,格式如下:

/** * rest介面通用返回值資料結構 * @param  */public class ResultDto {    //介面狀態(成功還是失敗)    private Boolean success;    //錯誤碼    private String code;    //提示資訊    private String msg;    //資料    private T data;    public static  ResultDto success(T data) {        return success(data, “操作成功!”);    }    public static  ResultDto success(T data, String msg) {        ResultDto result = new ResultDto<>();        result。setSuccess(Boolean。TRUE);        result。setMsg(msg);        result。setData(data);        return result;    }    //省略get、set方法}

控制器中所有的方法都返回 ResultDto 型別的結果,如下程式碼

@RestControllerpublic class UserController {    Map userDtoMap = new ConcurrentHashMap<>();    {        userDtoMap。put(1L, new UserDto(1L, “路人”, 30));        userDtoMap。put(2L, new UserDto(2L, “張三”, 20));        userDtoMap。put(3L, new UserDto(3L, “李四”, 18));    }    @GetMapping(“/user/list。do”)    public ResultDto list() {        return ResultDto。success(this。userDtoMap。values());    }    @GetMapping(“/user/{id}。do”)    public ResultDto user(@PathVariable(“id”) Long id) {        return ResultDto。success(this。userDtoMap。get(id));    }}

5、案例程式碼

git地址:https://gitee。com/javacode2018/springmvc-series

返回json & 通用返回值設計 | SpringMVC系列第8篇

6、總結

掌握@ResponseBody 的用法,用來返回 json 格式的資料,注意需要在 springmvc 配置檔案中添加註解驅動的配置,否則呼叫會報錯

<

mvc:annotation-driven

/>

掌握通用介面返回值的用法

原文連結:https://mp。weixin。qq。com/s/PcNQ7xCmooz_rQflaKpcWg