文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ResponseBodyAdvice常见问题及解决方法

2023-06-20 12:31

关注

这篇文章主要讲解了“ResponseBodyAdvice常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ResponseBodyAdvice常见问题及解决方法”吧!

场景

通过ResponseBodyAdvice实现Rest接口的日志统一管理

正文

ResponseBodyAdvice原理自己百度,代码比较少但是我实践的时候发现有几个坑需要注意一下

@RestControllerAdvice(basePackages = "com.alan.api.controller")public class ApiResponseBodyAdvice implements ResponseBodyAdvice {    static org.slf4j.Logger logger = LoggerFactory.getLogger("logback_api");    @Override    public boolean supports(MethodParameter returnType, Class converterType) {        return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||                returnType.hasMethodAnnotation(ResponseBody.class));    }    @Override    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,                  Class selectedConverterType, ServerHttpRequest serverHttpRequest, ServerHttpResponse response) {        HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();        if(request != null){            Object obj = request.getSession().getAttribute(BaseController.session_user);            String path = request.getServletPath();            if (StringUtils.isBlank(path)) {                path = request.getPathInfo();            }            if (obj != null) {                path = request.getPathInfo();                logger.info("userId:"+ ((DataUser) obj).getUserId());            }            logger.info("url:"+ path);            logger.info("request:"+ JSON.toJSONString(request.getParameterMap()));            logger.info("response:"+body);        }        return body;    }}

没了就这么简单

生效可能情况

ApiResponseBodyAdvice bean没有scan,没有什么配置

如果Controller的注解为@Controller,生效的方法为@ResponseBody

supports()支持类型返回false,beforeBodyWrite()不调用

spring切面接口ResponseBodyAdvice的分析及使用

ResponseBodyAdvice接口属于springMVC 和springBoot框架基础的底层切面接口;实现这个接口的类,可以修改直接作为 ResponseBody类型处理器的返回值,即进行功能增强。

1、有两种类型的处理器会将返回值作为ResponseBody:

返回值为HpptEntity

加了@ResponseBody或@RestController注解,

实现了这个接口的类,处理返回的json值在传递给 HttpMessageConverter之前;应用场景在spring项目开发过程中,对controller层返回值进行修改增强处理。比如返回值5,需要封装成

{"code":"0","data":5,,"msg":"success"}格式返回前端

接口源码如下:

public interface ResponseBodyAdvice<T> {     / * *    *该组件是否支持给定的控制器方法返回类型    *和选择的{@code HttpMessageConverter}类型。    返回类型    * @param converterType选择的转换器类型    * @return {@code true}如果{@link #beforeBodyWrite}应该被调用;    * {@code false}否则    * /boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType);    / * *    *在{@code HttpMessageConverter}被选中之后和之前调用    *它的write方法被调用。    * @param body要写入的主体    控制器方法的返回类型:    * @param selectedContentType通过内容协商选择的内容类型    * @param selectedConverterType选择写入响应的转换器类型    * @param request当前请求    * @param response当前响应    * @return传入的主体或修改过的(可能是新的)实例   * /@NullableT beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType,ServerHttpRequest request, ServerHttpResponse response);}

2、应用场景在spring项目开发过程中

对controller层返回值进行修改增强处理。比如返回值5,需要封装成

{"code":"0","data":5,,"msg":"success"} 格式返回前端

controller层业务代码:

@RestController //此注解包含@ResponseBody注解@RequestMapping("/nandao")public class ResponseBodyAdviceController {     @RequestMapping(value = "/hello", method = RequestMethod.GET)    public int hello() {         //业务代码省略        return 5;    } }

实现ResponseBodyAdvice接口的切面类:

@ControllerAdvice(annotations = RestController.class)public class RestResultWrapper implements ResponseBodyAdvice<Object> {    @Override    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {        return true;    }     @Override    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,                                  ServerHttpResponse response) {             //定义一个统一的返回类            RestResult responseResult = new RestResult( "0", body, "success");             //如果handler处理类的返回类型是String(即控制层的返回值类型),为了保证一致性,这里需要将ResponseResult转回去            if(body instanceof String) {                return JSON.toJSONString(responseResult);            }           //封装后的数据返回到前端页面            return JSONObject.toJSON(responseResult);           } }

返回公共类的创建:

public class RestResult<T>  implements Serializable {         private String code = "2000";        private T data;        private String message ;     public RestResult() {    }     @Override    public String toString() {         return "RestResult{" +                "code='" + code + '\'' +                ", data=" + data +                ", message=" + message +                '}';    }     public RestResult(String code, T data, String message) {        this.code = code;        this.data = data;        this.message = message;    }     public String getCode() {        return code;    }     public void setCode(String code) {        this.code = code;    }     public T getData() {        return data;    }     public void setData(T data) {        this.data = data;    }     public String getMessage() {        return message;    }     public void setMessage(String message) {        this.message = message;    }}

到此切面增强功能就实现了,可以直接在实战项目中使用。

感谢各位的阅读,以上就是“ResponseBodyAdvice常见问题及解决方法”的内容了,经过本文的学习后,相信大家对ResponseBodyAdvice常见问题及解决方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯