准确来说,@JsonView注解不是Spring的,它位于jackson-annotation包中; 作用:SpringMvc使用@ResponseBody将结果以json返回客户端,  有些实体类的某些字段可以不被包括在JSON中;

思考了这种情况可能适用的情形:有多方调用这个接口,需要针对不同业务场景返回不同形式的JSON,但是这种情况的话 只拷贝需要的属性 再返回也能达到目的,就当多学了一种注解、处理方式了;

一.作为 Jackson Api使用:

public class View {
public static class UserPublic{} public static class UserPrivacy{}
}
public class User {
@JsonView(View.UserPublic.class)
public int id; @JsonView(View.UserPrivacy.class)
public String name;
}

补充说明:每一个@JsonView标注在属性上,代表该属性在被序列化时候会被转化,视图名字为value指向的class;

public class User {
@JsonView(View.UserPublic.class)
int id; @JsonView(View.UserPrivacy.class)
String name; public void setId(int id) {
this.id = id;
} public void setName(String name) {
this.name = name;
}
} public static void main(String[] args) throws JsonProcessingException {
User user = new User();
user.setId(1);
user.setName("lvbb");
ObjectMapper mapper = new ObjectMapper();
String res1 = mapper.writerWithView(View.UserPublic.class).writeValueAsString(user);
System.out.println(res1);
String res2 = mapper.writerWithView(View.UserPrivacy.class).writeValueAsString(user);
System.out.println(res2);
}

输出结果:

@JsonView注解没有@Repeatable注解标注,意味着一个属性只能标注一个@JsonView注解,  比如 View.UserPrivacy 这个Json View也需要有id字段,解决方案就是 让 UserPrivacy 继承 UserPublic视图

同样的main方法查看输出: {"id":1,"name":"lvbb"}

二. 结合Spring的使用方式. (注解@JsonView的 value只能为一个)

简单列举个例子如下: 在@ResponseBody标注下添加  @JsonView指定要展示的JSON View即可.

    @RequestMapping("/demo2")
@ResponseBody
@JsonView(value = MyView.UserDetail.class)
public User demo2(){
User user = new User();
user.setName("lvbinbin");
user.setPassword("qwer0-5");
return user;
}

上面的代码使用效果和下面一段是一模一样的:

@RequestMapping(value = "/demo4")
@ResponseBody
public MappingJacksonValue demo4(){
User user = new User();
user.setName("lvbinbin");
user.setPassword("qwer0-5");
MappingJacksonValue mjv=new MappingJacksonValue(user);
mjv.setSerializationView(MyView.UserDetail.class);
return mjv;
}

Json View  Api使用:

        User user = new User();
user.setId(1);
user.setName("lvbb");
ObjectMapper mapper = new ObjectMapper();
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
mappingJacksonValue.setSerializationView(View.UserPrivacy.class);
ObjectWriter writer = mapper.writerWithView(mappingJacksonValue.getSerializationView());
String res4= writer.writeValueAsString(mappingJacksonValue.getValue());
System.out.println(res4);

当然MappingJacksonValue好像也是支持SpringMvc跨域JSONP调用的,具体不太了解以后补上.

同样类似的,接收JSON请求参数使用 @RequestBody同样可以和 @JsonView使用,这时候前台接收到参数就可以忽略指定的字段

    @RequestMapping("/demo5")
@ResponseBody
public String demo5(@RequestBody @JsonView(MyView.UserSimple.class) User user){
System.out.println(user);
return "Hello World";
}

Spring底层对MappingJacksonValue以及 @JsonView 流程记录:

MappingJackson的处理过程如下

org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal 有这样一个代码片段:

@ResponseBody的返回值类型是MappingJacksonValue类型时,会做的多一步转换工作,取出mappingJackson的value值.

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters

在往响应对象Response写回结果之前, 会调用ResponseBodyAdvice接口的beforeBodyWrite方法进行切面处理,当前对象为 RequestResponseBodyAdviceChain,其持有JsonViewResponseBodyAdvice 以及JsonViewRequestBodyAdvice, 前者就是处理@ResponseBody的;

JsonViewResponseBodyAdvice 直接获取了 方法上的JsonView注解,然后调用Jackson View Api进行设置;也就是说上面提及到的两种方式是一模一样的.

参考文档:

一个关于jackson使用很全面的外文网站https://www.baeldung.com/jackson

SpringMvc @JsonView 使用方式的更多相关文章

  1. spring+springMVC集成(annotation方式)

    spring+springMVC集成(annotation方式) SpringMVC+Spring4.0+Hibernate 简单的整合 MyBatis3整合Spring3.SpringMVC3

  2. SpringMVC的注解方式

    mvc-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  3. 一起学SpringMVC之Request方式

    本文主要以一些简单的小例子,简述在SpringMVC开发过程中,经常用到的Request方面的内容,仅供学习分享使用,如有不足之处,还请指正. 概述 在客户机和服务器之间进行请求-响应时,两种最常被用 ...

  4. springmvc 用注解方式添加事务不生效解决方法

    springmvc 事务注册有很多种方法,在此我只mark 用注解方式添加transaction不生效的解决办法. springmvc 注解方法添加事务步骤: 1.在 spring的 root-con ...

  5. springMVC两种方式实现多文件上传及效率比较

    springMVC实现 多文件上传的方式有两种,一种是我们经常使用的以字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传.这两种方式对于实 现多文件上传效率上却有着很大的 ...

  6. SpringMVC的注解方式配置

    SpringMVC支持使用注解方式配置,比配置文件方式更加灵活易用,是SpringMVC使用的主流模式. 1.在配置文件中开启SpringMVC的注解 <!-- 开启包扫描 --> < ...

  7. SpringMVC初写(一)SpringMVC的配置方式

    1.Spring概述a)SpringMVC是什么?SpringMVC是Spring框架内置的MVC实现.SpringMVC就是一个Spring内置的MVC子框架MVC:Model-View-Contr ...

  8. mybatis 热部署xml文件(spring boot和springmvc两种方式)

    参考:http://thinkgem.iteye.com/blog/2304557 步骤:1.创建两个java类 (1)MapperRefresh.java   :用于刷新mapper (2)SqlS ...

  9. 1.springMVC Controller配置方式

    一.手动配置方式 1.web.xml中DispatcherServlet控制器的的配置 SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是Dispatc ...

随机推荐

  1. hdu 4939 三色塔防

    http://acm.hdu.edu.cn/showproblem.php?pid=4939 给出一条长为n个单位长度的直线,每通过一个单位长度需要 t 秒. 有3种塔,红塔可以在当前格子每秒造成 x ...

  2. 初始kafka

    kafka 简介 Kafka是Linkedin于2010年12月份开源的消息系统 一种分布式的.基于发布/订阅的消息系统 ,另外提供数据分布式缓存功能 特点 消息持久化:通过O(1)的磁盘数据结构提供 ...

  3. [ X.XX]CF每日一题系列线下更新中

    现在做的都好水啊,就不写博客了,线下有记录滴

  4. MVC简介与三层架构

    感谢博客园团队日夜辛苦的付出 感谢阅读我文章的每位读者 1.MVC简介 MVC最早于1978年提出,是软件工程中的一种软件架构模式,这时距离微软在1985年推出Window1.0还有7年之久,当时的M ...

  5. c++中的一些计算的问题

    要实现小数的四舍五入, float a = 3.456; //保留到小数点后两位 float b =(int)((a * 100) + 0.5) / 100.0; 但是这样对负数不好使, 对负数的话, ...

  6. HDU - 2604 Queuing(递推式+矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. 移动端font-size适配方案

    概述 这是我研究移动端页面时的思考,记录下来供以后开发时参考,相信对其他人也有用.由于我写移动端页面写的还比较少,一些问题都还没遇到,所以我的这篇博文不免有些错误的地方,还请大佬多多指正. 这篇文章是 ...

  8. 【UML】:时序图

    时序图表达了类之间调用关系,以及调用时序关系. Actor: 调用者实例化类的对象,执行者. Lifeline: 生命线,竖的虚线.上方方框是类名表示存在的时间,从上至下表示时间流逝.Lifeline ...

  9. 使用Express构建RESTful API

    RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...

  10. Flask 微博三方登录

    1.进入微博开发平台(https://open.weibo.com/),注册账号,填写开发者信息 2.创建应用.创建应用完成后,可以在"我的应用 - 应用信息"中查看您所创建应用的 ...