Spring MVC @JsonView实现在消息转换器中过滤数据

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;
}
  1. 创建一个View类,里面含有一个接口。(注解里用,注意如果需要在其他包中使用interface得是public的)
  2. 在实体当中就可以使用@JsonView注解来标注这个字段在哪种类型的View当中被转换了。
  3. 在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的配置当中一定要加上 这个东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值