细粒度定制化JSON返回字段,精确控制每一个接口方法返回的字段

1. 创建注解CustomReturnJson 标注在controller 的方法上。 示例:

    @RequestMapping("/testJson")@ResponseBody@CustomReturnJson(include = {"id","topicName","topicImg"})public Object testJson(@RequestParam("name")String name){Topic topic = topicService.getByTopicName(name);return ResultVO.success(topic);}

只返回 id topicName,topicImg 字段

import java.lang.annotation.*;/*** @author XXX* Date: 2019/4/11* Description:该注解配合 @ResponseBody 一起使用来细粒度定制返回的json @see {CustomReturnResponseBody.class}*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomReturnJson {/*** 返回的json包含哪些字段*/String[] include() default {};}

2.核心逻辑就是实现 ResponseBodyAdvice  方法beforeBodyWrite ,在json返回前处理

import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.BeanContext;
import com.alibaba.fastjson.serializer.ContextValueFilter;
import com.linktime.unitimes.annotation.CustomReturnJson;
import com.linktime.unitimes.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;/*** @author liuxun* Date: 2019/4/11* Description: 用来控制定制化json 返回*/
@ControllerAdvice
@ConditionalOnProperty(name = "CUSTOM_RETURN_JSON_ADVICE",havingValue = "true")
@Slf4j
public class CustomReturnJsonAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter methodParameter, Class aClass) {return methodParameter.getMethodAnnotation(CustomReturnJson.class) != null;}@Nullable@Overridepublic Object beforeBodyWrite(@Nullable Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest request, ServerHttpResponse response) {if(body != null && body instanceof ResultVO){try {ResultVO vo = (ResultVO) body;Object data = vo.getData();CustomReturnJson methodAnnotation = methodParameter.getMethodAnnotation(CustomReturnJson.class);String[] include = methodAnnotation.include();List<String> collect = Arrays.stream(include).collect(Collectors.toList());ContextValueFilter valueFilter = new ContextValueFilter () {@Overridepublic Object process(BeanContext context, Object object, String name, Object value) {if(collect.contains(name)){if(value == null){return "";}return value;}else {return null;}}};String jsonOutput = JSON.toJSONString(data,valueFilter);Object parse = JSONUtils.parse(jsonOutput);vo.setData(parse);return vo;} catch (Exception e) {log.error("CustomReturnResponseBody方法出错",e);// 如果出错,原样返回。(就当该不存在这个流程)}}return body;}}

实现 ResponseBodyAdvice 定制化JSON 返回字段相关推荐

  1. 在C#中使用Json.Net进行序列化和反序列化及定制化

    序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象:反序列化(Deserialize)则是将上面的字节流转换为相应对象的 ...

  2. Json diff 定制化需求

    需求背景 有一个比较 json 的需求,希望对比高亮不同的值,并给出对应的key值一个波动范围,比较不同的值,如果超出波动范围则进一步高亮并在后面给出对应的变化率.效果上有点像下图 diffcheck ...

  3. 解决VO类属性与要返回的json串字段名称不一样的问题

    结论:解决VO类属性与要返回的json串字段名称不一样的问题,需要用到@JsonProperty("xxx")这个注解 那具体怎么使用呢?下面我拿我个人的例子来说明. 需要返回的j ...

  4. 使用百度EasyDL定制化图像识别(二)

    上一篇讲述了如何创建模型.训练模型.校验模型.发布模型,接下来我们学习如何在Python下请求我们的接口服务. 1.进入百度云首页(不是百度云盘),进入控制台,在产品服务中选择图像识别,点击创建应用, ...

  5. eggjs的参数校验模块egg-validate的使用和进一步定制化升级

    简单讲一下这个egg-validate egg-validate是基于parameter的. 安装 npm install --save egg-validate 启用 // config/plugi ...

  6. 高度可定制化的方案_如何开发高度可定制的产品

    高度可定制化的方案 您是否听说过:"我们非常喜欢您的产品--除了一些小细节."? 然后,CIO推出了一系列其他"必备"要求的清单,其中有数百个要添加到您的惊人产 ...

  7. python图形代码怎么写_【Python3-API】定制化图像接口示例代码

    Python3-urllib3-API定制化图像接口示例代码 AccessToken获取可以参考:http://ai.baidu.com/forum/topic/show/497663(Python3 ...

  8. vue项目中动态创建模块以满足客户定制化需求的解决方案

    前端项目中很多时候会遇到这样的业务需求: 所有的客户都有共同的一些业务需求,即基础需求 基础需求需要根据业务发展进行升级 在共同需求的基础上,每个客户又有不同的需求(客制化) 如果只是一两个客户还好, ...

  9. vue-draggable-resizable定制化可拖动控件

    最近遇到一个需求:前端定制化生成合同模板,生成时可以在指定位置拖放指定的控件,可动态编辑指定控件的属性和位置,最后将控件的位置等属性传给后台,后续使用模板签署合同时,乙方可在模板上指定位置签署. 点击 ...

最新文章

  1. 数据结构与算法:04 C#面向对象设计 II
  2. 【FPGA】单端口RAM的设计(异步读、同步写)
  3. 手动整合ssh框架时的各种错误
  4. 1. Spring boot 之热部署
  5. FreeMarker 用户自定义指令@(3.4)
  6. Bzoj 2724: [Violet 6]蒲公英(分块)
  7. 记录链接:与杜克一起玩
  8. input组件android,React-Native TextInput组件详解及实例代码
  9. el-table使用图片实例代码
  10. netbeans运行KEmulator
  11. 学术壁报模板_中华医学会核医学分会2020年学术年会征文通知
  12. VC2012学习笔记(控件)
  13. oracle数据库的关于建表的sql语句练习
  14. 小马哥spring编程核心思想_《Spring Boot编程思想(核心篇)》小马哥著 PDF电子书下载...
  15. Datawhale组队学习(Pandas) task8-文本数据
  16. 解决导出为Excel时文件名乱码的问题。
  17. el-table表格某列添加icon图标
  18. crt格式证书转pem格式证书
  19. Java应用程序安全框架
  20. 我的一百个2019(三):2019,我赚钱了!

热门文章

  1. 项目管理中的项目干系人
  2. php开发自己的composer包
  3. c语言小程序飞机大战,飞机大战微信小游戏:经典像素飞机大战小程序,点开即玩...
  4. 其实更换照片底色,使用excel也可以完成。
  5. 时间序列-ARIMA
  6. 微信域名防封,细说微信域名防封技术原理
  7. 同时删除多个 PDF 文档最后几页
  8. 使用bootstrap框架快速开发网页
  9. Android系统SD卡各类文件夹名称
  10. 那些年,磕磕碰碰的BUG