前言
在 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 父类的字段也响应出来
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于