注册 ResponseBodyHandler 到 controller 返回值处理器里,即添加自己的返回值处理器
package com.olive.config;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.method.support.HandlerMethodReturnValueHandler;import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;import java.util.ArrayList;import java.util.List;@Configurationpublic class WebConfig implements InitializingBean {@Autowiredprivate RequestMappingHandlerAdapter adapter;@Overridepublic void afterPropertiesSet() throws Exception {List<HandlerMethodReturnValueHandler> unmodifiableList = adapter.getReturnValueHandlers();List<HandlerMethodReturnValueHandler> list = new ArrayList<>(unmodifiableList.size());for (HandlerMethodReturnValueHandler returnValueHandler : unmodifiableList) {if (returnValueHandler instanceof RequestResponseBodyMethodProcessor) {//将RequestResponseBodyMethodProcessor 实际返回值替换为自定义的,实际执行为RequestResponseBodyMethodProcessor//重要HandlerMethodReturnValueHandler handler = new ResponseBodyHandler(returnValueHandler);list.add(handler);} else {list.add(returnValueHandler);}}adapter.setReturnValueHandlers(list);}}
测试编写 Springboot 启动引导类
【Springboot 之 HandlerMethodReturnValueHandler 运用】package com.olive;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * https://cloud.tencent.com/developer/article/1616704 * * @author 2230 * */@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}}
编写测试 Controller
package com.olive.controller;import java.util.HashMap;import java.util.Map;import com.olive.annotation.Encrypted;import com.olive.dto.ResultInfo;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class TestController { @Encrypted @RequestMapping("/reqBody") public ResultInfo<Map<String, Object>> reqBody(){ResultInfo<Map<String, Object>> resultInfo = new ResultInfo<>();resultInfo.setCode(200);resultInfo.setMessage("success");Map<String, Object> map = new HashMap<>();map.put("userId", 100);map.put("tenantId", 1001);map.put("userName", "bug弄潮儿");resultInfo.setBody(map);return resultInfo; }}
通过 HandlerMethodReturnValueHandler 可以对返回的数据进行进一步的封装,减少在业务代码中进行重复的返回值处理 。例如,文章中的对返回数据进行统一加密 。
经验总结扩展阅读
- 急性胃炎会头晕吗
- 生日蛋糕怎么做不失败
- 哲仁王后女主后来回来了吗_哲仁王后女主之后有没有回来
- 巴哥犬也有体形大小之分吗
- 分布式存储系统之Ceph基础
- 十二生肖里什么动物是海中之王
- 王者荣耀怎么获得25个蔷薇之心
- 伊洛纳野蛮人之怒怎么学
- 盗贼之海雅典娜怎么开门
- cos多少度等于五分之三