背景
地点:xxxx公司会议室
前端A: 你们后端接口返回的json太复杂啦!我这例只需要用户的真实姓名和年龄就可以了,结果你们返回了我一大串,好几十个字段……
前端B: 是呀!是呀!身份证信息是敏感的,这里也不需要用,你们竟然也返回了,还有密码都给我们了!幸亏是加密的~
后端小菜:多余的字段你们不要管就好啦,又不影响你们~,实在不行我拷贝个新对象给你!
老板在一旁没有说话,皱了下眉头~
思考
🤔接口传输大量无用数据占用带宽资源、影响性能、甚至泄漏敏感信息!拷贝新对象的话,需求多样会很繁琐而且难以维护,有可能写了两个拥有一样属性的对象~
设计
针对接口响应的json做处理,筛选出需要的字段,通过注解的方式实现简单明了的维护,支持“复杂嵌套”、“仅筛选”、”仅排除“。
演示视频demo下载
talk is cheap, show me the code
SerializeField
/**
* @Author l'amour solitaire
* @Description TODO
* @Date 2020/8/11 下午8:55
**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SerializeField {
Class clazz();
/**
* 需要返回的字段
* @return
*/
String[] includes() default {};
/**
* 需要去除的字段
* @return
*/
String[] excludes() default {};
}
MultiSerializeField
/**
* @Author l'amour solitaire
* @Description 用于嵌套类情况的二层过滤(本质目的,为了可以二次执行)
* @Date 2020/8/11 下午8:52
**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MultiSerializeField {
Class clazz();
/**
* 需要返回的字段
* @return
*/
String[] includes() default {};
/**
* 需要去除的字段
* @return
*/
String[] excludes() default {};
}
MoreSerializeField
/**
* @Author l'amour solitaire
* @Description TODO
* @Date 2020/8/11 下午8:55
**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MoreSerializeField {
SerializeField[] value() default {};
}
WebMvcConfig
/**
* @Author l'amour solitaire
* @Description TODO
* @Date 2020/7/16 上午9:53
**/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
JsonFilterHttpMessageConverter fastConverter = new JsonFilterHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.DisableCircularReferenceDetect);
// 处理中文乱码问题
fastConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaType.APPLICATION_OCTET_STREAM));
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
}
测试
@RequestMapping("jsonFilter")
@MoreSerializeField({
@SerializeField(clazz = People.class, includes = {"name", "ext"}),
@SerializeField(clazz = PeopleExt.class, excludes = {"age"})
})
public R getUser() {
return R.ok(new People().setAddr("杭州").setName("张三")
.setExt(new PeopleExt().setAge(20).setSex(1))
);
}
过滤前响应报文
过滤后响应报文
欢迎咨询公众号《小马JAVA》
插件已上传中央仓库,可联系我获取,集成非常简单,无代码入侵,项目源码客通过下方链接下载,尊重知识劳动成果,谢谢!也欢迎大家积极技术讨论,QQ群:132381997
项目源码