天天看点

Spring MVC 更灵活的控制 json 返回

这篇文章主要讲 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 注解的时候,使用该类来处理返回值。

通过这些,我们就可以最终实现以下效果。