这篇文章主要讲 spring mvc 如何动态的去返回 json 数据 在我们做 web 接口开发的时候, 经常会遇到这种场景。
两个请求,返回同一个对象,但是需要的返回字段并不相同。如以下场景
spring mvc 默认使用转json框架是 jackson。 大家也知道, jackson 可以在实体类内加注解,来指定序列化规则,但是那样比较不灵活,不能实现我们目前想要达到的这种情况。
这篇文章主要讲的就是通过自定义注解,来更加灵活,细粒化控制 json 格式的转换。
最终我们需要实现如下的效果:
jackson 中, 我们可以通过 objectmapper.setfilterprovider 来进行过滤规则的设置,jackson 内置了一个 simplefilterprovider 过滤器,这个过滤器功能比较单一,不能很好的支持我们想要的效果。于是我自己实现了一个过滤器 jacksonjsonfilter
通过这个过滤器,我们可以实现
输出结果
我们需要实现文章开头的那种效果。这里我自定义了一个注解,可以加在方法上,这个注解是用来携带参数给 customerjsonserializer.filter 方法的,就是某个类的某些字段需要过滤或者包含。这里我们定义了两个注解 @json 和 @jsons , 是为了放方法支持 多重 @json 注解
封装 json 转换
注解有了,过滤器也有了,那么我们来封装一个类,用作解析注解以及设置过滤器的。 customerjsonserializer.java
我们之前的 demo 可以变成:
handlermethodreturnvaluehandler 接口 spring mvc 用于处理请求返回值 。 看一下这个接口的定义和描述,接口有两个方法supportsreturntype 用来判断 处理类 是否支持当前请求, handlereturnvalue 就是具体返回逻辑的实现。
我们平时使用 @responsebody 就是交给 requestresponsebodymethodprocessor 这个类处理的
还有我们返回 modelandview 的时候, 是由 modelandviewmethodreturnvaluehandler 类处理的
要实现文章开头的效果,我实现了一个 jsonreturnhandler类,当方法有 @json 注解的时候,使用该类来处理返回值。
通过这些,我们就可以最终实现以下效果。