0x01问题描述
最近做的项目,很多地方是为手机端编写的接口。领导要求只返回必要的数据,所以就要进行过滤。要求要灵活配置,编写简单。
0x02 思路
-第一种思路就是,在service中返回数据后,用代码将不必要的数据设置为NULL。 sucks~!不考虑。
-然后找到了json-lib包中的组件进行过滤,这种方式也需要写不少代码。而且没有跟spring mvc的消息转换器结合,所以这种实现方式虽然可以达到效果,但是不够优雅。
-最后很自然的就想到了Spring MVC当中@ResponseBody注解所引用的消息转换器jackson。于是在spring官网上就找到了这一篇。Latest Jackson integration improvements in Spring
0x03用法
用法很简单如下:
public class View {
interface Summary {}
}
public class User {
@JsonView(View.Summary.class)
private Long id;
@JsonView(View.Summary.class)
private String firstname;
@JsonView(View.Summary.class)
private String lastname;
private String email;
private String address;
private String postalCode;
private String city;
private String country;
}
public class Message {
@JsonView(View.Summary.class)
private Long id;
@JsonView(View.Summary.class)
private LocalDate created;
@JsonView(View.Summary.class)
private String title;
@JsonView(View.Summary.class)
private User author;
private List<User> recipients;
private String body;
}
- 创建一个View类,里面含有一个接口。(注解里用,注意如果需要在其他包中使用interface得是public的)
- 在实体当中就可以使用@JsonView注解来标注这个字段在哪种类型的View当中被转换了。
在Controller当中,就能用刚才的注解来标注,你想要哪种类型的过滤后的结果了。
@RestController public class MessageController { @Autowired private MessageService messageService; @JsonView(View.Summary.class) @RequestMapping("/") public List<Message> getAllMessages() { return messageService.getAll(); } @RequestMapping("/{id}") public Message getMessage(@PathVariable Long id) { return messageService.get(id); } }
具体内容参见代码和链接吧,刚开始写博客。感觉自己都不知道怎么说话了。
注意,spring 4.x以后才支持这个功能。并且在dispacherServlet的配置当中一定要加上 这个东西。