需求:

由于平时会写一些数据返回到前端,然而往往的情况是:

仅仅需要部分的字段属性,所以有时就得做一些操作保证只返回所需要的字段

特别是 针对手机端的接口或者其他走HTTP协议的接口 需要对象内部分属性

方案:

利用@JsonView注解很方便的搞掂这事. 他可以控制输出我们想要序列化的字段属性

且简单易用易懂

publicclassView{interfaceSummary{}}publicclassUser{@JsonView(View.Summary.class)privateLongid;@JsonView(View.Summary.class)privateStringfirstname;@JsonView(View.Summary.class)privateStringlastname;privateStringemail;privateStringaddress;privateStringpostalCode;privateStringcity;privateStringcountry;}publicclassMessage{@JsonView(View.Summary.class)privateLongid;@JsonView(View.Summary.class)privateLocalDatecreated;@JsonView(View.Summary.class)privateStringtitle;@JsonView(View.Summary.class)privateUserauthor;privateList<User>recipients;privateStringbody;}

@RestControllerpublicclassMessageController{@AutowiredprivateMessageServicemessageService;@RequestMapping("/")publicList<Message>getAllMessages(){returnmessageService.getAll();}@RequestMapping("/{id}")publicMessagegetMessage(@PathVariableLongid){returnmessageService.get(id);}}

在上面的实例中,只有getAllMessages()这个方法有@JsonView(View.Summary.class)注解,所以它的请求只会出现被注解标注要序列化的字段属性

响应的结果: 只会出现被注解的属性

[{"id":1,"created":"2014-11-14","title":"Info","author":{"id":1,"firstname":"Brian","lastname":"Clozel"}},{"id":2,"created":"2014-11-14","title":"Warning","author":{"id":2,"firstname":"Stéphane","lastname":"Nicoll"}},{"id":3,"created":"2014-11-14","title":"Alert","author":{"id":3,"firstname":"Rossen","lastname":"Stoyanchev"}}]

而如果调用getMessage(@PathVariable Long id) 这个方法 则返回的数据结果:

所有的Message所有的字段属性

{"id":1,"created":"2014-11-14","title":"Info","body":"Thisisaninformationmessage","author":{"id":1,"firstname":"Brian","lastname":"Clozel","email":"bclozel@pivotal.io","address":"1Jauresstreet","postalCode":"69003","city":"Lyon","country":"France"},"recipients":[{"id":2,"firstname":"Stéphane","lastname":"Nicoll","email":"snicoll@pivotal.io","address":"42Obamastreet","postalCode":"1000","city":"Brussel","country":"Belgium"},{"id":3,"firstname":"Rossen","lastname":"Stoyanchev","email":"rstoyanchev@pivotal.io","address":"3Warrenstreet","postalCode":"10011","city":"NewYork","country":"USA"}]}


另外 @JsonView注解也是支持继承的


publicclassView{interfaceSummary{}interfaceSummaryWithRecipientsextendsSummary{}}publicclassMessage{@JsonView(View.Summary.class)privateLongid;@JsonView(View.Summary.class)privateLocalDatecreated;@JsonView(View.Summary.class)privateStringtitle;@JsonView(View.Summary.class)privateUserauthor;@JsonView(View.SummaryWithRecipients.class)privateList<User>recipients;privateStringbody;}@RestControllerpublicclassMessageController{@AutowiredprivateMessageServicemessageService;@JsonView(View.SummaryWithRecipients.class)@RequestMapping("/with-recipients")publicList<Message>getAllMessagesWithRecipients(){returnmessageService.getAll();}}

结果中多了recipients属性


{"id":1,"created":"2014-11-14","title":"Info","body":"Thisisaninformationmessage","author":{"id":1,"firstname":"Brian","lastname":"Clozel",},"recipients":[{"id":2,"firstname":"Stéphane","lastname":"Nicoll",},{"id":3,"firstname":"Rossen","lastname":"Stoyanchev",}]}