栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

009-Spring MVC Json返回

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 {

    
    private boolean success;

    
    private String msg;

    
    private int status;

    
    private int bizCode;

    
    private T content;

    private MyResponse(){}

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

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

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

        return response;
    }

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

        return response;
    }

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

        return response;
    }


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

        return response;
    }

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

        return response;
    }

    public static final  MyResponse error(String msg,T content,int bizCode){
        MyResponse 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视图解析器
下一篇:待续

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351259.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号