SpringBoot result 风格响应指定字段

本贴最后更新于 2078 天前,其中的信息可能已经渤澥桑田

前言

在 SpringBoot 开发过程中 总会遇到 并不需要将 Bean 对象中的所有字段全部响应

这时候 我们就可以使用到 JsonView 这个注解了

编写接口

其实这里的接口 只是用来做标记使用的 给 Bean 的字段进行分类标记

在 JSONViewInterface 下 Video 这个接口是我拿来分类的 Video 下有一个 ViewHot 这个 ViewHot 继承 Base

而 Video 下的 All 继承了 ViewHot 后面我们看下效果

记住这个 Base 要让 JSONViewInterface 里面所有的接口去继承它 (分类接口除外)

public interface JSONViewInterface {
    interface Video {
     
        interface ViewHot extends Base {

        }
        interface All extends ViewHot {

        }
    }
    interface Base {

    }
}

编写 Entity

我们先来看 Result 的 Entity

Result 风格的 API 主要是统一响应的风格 我这里举个例子

重点看 vdata 这个字段 这个字段呢 是给客户端响应的数据

我给它加了个注解是 @JsonView(JSONViewInterface.Base.class)

public class ResponeEntity implements Serializable {

    @JsonView(JSONViewInterface.Base.class)
    public int errorid;

    @JsonView(JSONViewInterface.Base.class)
    public String errordesc;
    
    @JsonView(JSONViewInterface.Base.class)
    public Object vdata;

}

接下来我们再看需要响应的实体类
可以看到 vtMid 被我注解了 @JsonView(JSONViewInterface.Video.ViewHot.class)
vtId 则注解了 @JsonView(JSONViewInterface.Video.All.class)

public class VTopTableModel {
    @JsonView(JSONViewInterface.Video.ViewHot.class)
    private Long vtMid;

     @JsonView(JSONViewInterface.Video.All.class)
    private Long vtId;
}

编写 Controller

接下来我们看 Controller 控制器

@JsonView(JSONViewInterface.Video.ViewHot.class) 这个注解表示要响应标记 JSONViewInterface.Video.ViewHot.class 这个接口的字段

@JsonView(JSONViewInterface.Video.ViewHot.class)
@RequestMapping("/hotVideo")
public ResponeEntity hotVideo() {
    List vTopTableModels = vTopService.selectHomeHot(getPageNum(), getPageSize());
    ResponeEntity responeEntity = new ResponeEntity();
    responeEntity.setErrorid(0);
    responeEntity.setErrordesc("操作成功");
    responeEntity.setVdata(vTopTableModels);
    return responeEntity;
}

最后看一下响应数据

ps: 在 Controller 注解了 JSONViewInterface.Video.ViewHot.class 所以只响应标记了这个接口的字段

{
    "errorid": 0,
    "errordesc": "操作成功",
    "vdata": [
        {
            "vtMid": "928fdfaef68e42e6803bc0fc9e04cc7a"
        },
        {
            "vtMid": "0fa8934d5cd44f63b011d392ecba78ed"
        },
        {
            "vtMid": "060f36725ac14b1596955c589e0b96a8"
        },
        {
            "vtMid": "70c845fbb0294d28bbd6e31090467fbb"
        },
        {
            "vtMid": "a12548ecfc084712848937f961402fb3"
        },
        {
            "vtMid": "444336fe669b475bb8d33a682aeb27f6"
        },
        {
            "vtMid": "8b6fdc1c51a641928c0cb69c740b0310"
        },
        {
            "vtMid": "a65c668e97c748c184dddd8eb401129c"
        },
        {
            "vtMid": "56e79c6ce068469db6ebe2ac359f2cba"
        },
        {
            "vtMid": "c5f63cf5933a4db08f68829e1aa789ec"
        }
    ]
}

再往下看标记 JSONViewInterface.Video.All.class
Controller 修改标记接口

@JsonView(JSONViewInterface.Video.All.class)
@RequestMapping("/hotVideo")
public ResponeEntity hotVideo() {
    List vTopTableModels = vTopService.selectHomeHot(getPageNum(), getPageSize());
    ResponeEntity responeEntity = new ResponeEntity();
    responeEntity.setErrorid(0);
    responeEntity.setErrordesc("操作成功");
    responeEntity.setVdata(vTopTableModels);
    return responeEntity;
}

响应数据

{
    "errorid": 0,
    "errordesc": "操作成功",
    "vdata": [
        {
            "vtMid": "928fdfaef68e42e6803bc0fc9e04cc7a",
            "vtId": 0
        },
        {
            "vtMid": "0fa8934d5cd44f63b011d392ecba78ed",
            "vtId": 1
        },
        {
            "vtMid": "060f36725ac14b1596955c589e0b96a8",
            "vtId": 2
        },
        {
            "vtMid": "70c845fbb0294d28bbd6e31090467fbb",
            "vtId": 3
        },
        {
            "vtMid": "a12548ecfc084712848937f961402fb3",
            "vtId": 4
        },
        {
            "vtMid": "444336fe669b475bb8d33a682aeb27f6",
            "vtId": 5
        },
        {
            "vtMid": "8b6fdc1c51a641928c0cb69c740b0310",
            "vtId": 6
        },
        {
            "vtMid": "a65c668e97c748c184dddd8eb401129c",
            "vtId": 7
        },
        {
            "vtMid": "56e79c6ce068469db6ebe2ac359f2cba",
            "vtId": 8
        },
        {
            "vtMid": "c5f63cf5933a4db08f68829e1aa789ec",
            "vtId": 9
        }
    ]
}

结尾 因为 JSONViewInterface.Video.All 接口继承了 JSONViewInterface.Video.ViewHot

所以 在 Controller 标记了 All 接口 会将标记了 ALL 父类的字段也响应出来

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 152 关注
  • JsonView
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...