IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 009-Spring MVC Json返回 -> 正文阅读

[Java知识库]009-Spring MVC Json返回

spring 中的json返回默认使用Jackson来处理。

Json返回

Controller

@RequestMapping("getUser")
    @ResponseBody
    public User getUser(){
        User user = new User();
        user.setName("李四");
        user.setAge(11);
        return user;
    }

@ResponseBody

没错,只需要在Controller方法上使用@ResponseBody注解,即可将我们的Controller方法返回的对象通过json格式返回给前端。

示例执行结果

在这里插入图片描述

以下方式也是json返回

@RestController
@RequestMapping("demo4")
public class Demo4Controller {

    @RequestMapping("getUser")
    public User getUser(){
        User user = new User();
        user.setName("李四");
        user.setAge(11);
        return user;
    }
    
}

@RestController

@RestController注解源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

我们可以看到@RestController有@Controller和@ResponseBody两个注解的作用,通常情况下,在当前Controller都是json返回的情况下我们就直接使用@RestController来简化我们的代码。

Json返回的类型转换问题

我们在003-Spring MVC URL映射与参数绑定一章中最后提到前端通过json发送参数给我们,我们后端使用@RequestBody注解结合对象Bean来接受参数。

我们在004-Spring MVC参数类型转换一章中提到json参数接受的类型转换的配置的两种方式。

以上提到的json类型转换配置同样作用与我们的json对象返回。所以我们在上面json对象返回时,数据的类型以及对应的格式都没有问题。

实际项目中Json返回的正确格式

在上面的示例中我直接将User对象进行了返回。请求成功的情况下返回结果为

{
    "name": "李四",
    "age": 11
}

但如果我们的Controller出现异常呢?或者Controller在参数验证的时候参数验证不通过呢?这是极端情况。
而且前端拿到我们的返回后无法判断是否是成功返回。
所以通常情况下我都会定义一个统一的类,该类包含当前请求是否成功,成功或失败时的提示信息,以及当前请求的返回值对象。如我们下面定义的MyResponse对象

MyResponse对象

package com.yyoo.framework.bean;

/**
 *
 * 统一结果对象
 *
 */
public class MyResponse<T> {

    /**
     * 应答成功或失败
     */
    private boolean success;

    /**
     * 提示消息
     */
    private String msg;

    /**
     * http 状态码
     */
    private int status;

    /**
     * 业务状态码
     */
    private int bizCode;

    /**
     * 返回结果对象
     */
    private T content;

    private MyResponse(){}

    public static final <T> MyResponse<T> success(){
        MyResponse<T> response = new MyResponse<T>();
        response.setSuccess(true);
        response.setStatus(200);
        return response;
    }

    public static final <T> MyResponse<T> success(String msg){
        MyResponse<T> response = success();
        response.setMsg(msg);
        return response;
    }

    public static final <T> MyResponse<T> success(T content){
        MyResponse response = success();
        response.setContent(content);

        return response;
    }

    public static final <T> MyResponse<T> success(String msg,T content){
        MyResponse response = success();
        response.setContent(content);
        response.setMsg(msg);

        return response;
    }

    public static final <T> MyResponse<T> error(String msg){
        MyResponse<T> response = new MyResponse<T>();
        response.setMsg(msg);
        response.setSuccess(false);
        response.setStatus(500);

        return response;
    }


    public static final <T> MyResponse<T> error(String msg,int bizCode){
        MyResponse<T> response = error(msg);
        response.setBizCode(bizCode);

        return response;
    }

    public static final <T> MyResponse<T> error(String msg,T content){
        MyResponse<T> response = error(msg);
        response.setContent(content);

        return response;
    }

    public static final <T> MyResponse<T> error(String msg,T content,int bizCode){
        MyResponse<T> response = error(msg);
        response.setContent(content);
        response.setBizCode(bizCode);

        return response;
    }

    //------------------------------------------------------
    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public int getBizCode() {
        return bizCode;
    }

    public void setBizCode(int bizCode) {
        this.bizCode = bizCode;
    }

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }
}

有了MyResponse对象后,我们的Json返回的代码如下:

package com.yyoo.springmvc.controller;

import com.yyoo.springmvc.bean.MyResponse;
import com.yyoo.springmvc.bean.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("demo4")
public class Demo4Controller {

    @RequestMapping("getUser")
    public MyResponse getUser(){
        try {
            User user = new User();
            user.setName("李四");
            user.setAge(11);
            return MyResponse.success("请求用户数据成功!",user);
        }catch (Exception e){
            return MyResponse.error("请求用户数据出错!");
        }
    }

}

前端拿到结果只需要通过success字段是否为true来判断请求是否成功,如果是false显示后台返回的提示信息或者前端自行处理即可。

示例中我们在Controller全局使用了try…catch,用于处理异常情况。Spring也提供了相应的全局异常处理机制,我们将在下一章说明。

上一篇:008-Spring MVC ViewResolver视图解析器
下一篇:待续

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:16:13  更:2021-10-28 12:17:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:21:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码