广告
返回顶部
首页 > 资讯 > 精选 >ResponseBodyAdvice常见问题及解决方法
  • 165
分享到

ResponseBodyAdvice常见问题及解决方法

2023-06-20 12:06:07 165人浏览 安东尼
摘要

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

这篇文章主要讲解了“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接口属于springMVCSpringBoot框架基础的底层切面接口;实现这个接口的类,可以修改直接作为 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常见问题及解决方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: ResponseBodyAdvice常见问题及解决方法

本文链接: https://www.lsjlt.com/news/296506.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ResponseBodyAdvice常见问题及解决方法
    这篇文章主要讲解了“ResponseBodyAdvice常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ResponseBodyAdvice常见问题及解决方法”吧!场景通过R...
    99+
    2023-06-20
  • Nacos的常见问题及解决方法
    本篇内容主要讲解“Nacos的常见问题及解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Nacos的常见问题及解决方法”吧!如何依赖最新的 Nacos 客户端?很多用户都是通过 Sprin...
    99+
    2023-06-02
  • Ubuntu常见问题及解决办法
        在刚开始使用Ubuntu系统时,总会遇到各种各样的小问题,这里整理了一些遇到的问题及解决办法,不断更新中!!! 目录 一、创建文件夹权限不够 1.1 问题描述  1.2 解决办法 二、Command 'vim' not foun...
    99+
    2023-09-24
    ubuntu linux 服务器
  • @ConfigurationProperties使用时常见问题及解决方法
    这篇文章主要介绍“@ConfigurationProperties使用时常见问题及解决方法”,在日常操作中,相信很多人在@ConfigurationProperties使用时常见问题及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好...
    99+
    2023-06-20
  • MySQL SSL 连接常见问题及解决方法
    MySQL SSL 连接常见问题及解决方法概述:Secure Socket Layer(SSL)是一种加密传输协议,用于保护数据在网络上的传输安全。MySQL 支持通过 SSL 连接数据库服务器,以增强数据的保密性和完整性。然而,在使用 M...
    99+
    2023-10-22
  • Redis常见的几个问题及解决方法
    本篇内容主要讲解“Redis常见的几个问题及解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis常见的几个问题及解决方法”吧! 1、如何保证Redis高可用和高并发Redi...
    99+
    2023-06-16
  • MySQL MHA配置的常见问题及解决方法
    这篇文章主要讲解了“MySQL MHA配置的常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL MHA配置的常见问题及解决方法”吧!...
    99+
    2022-10-18
  • Python中异常处理的常见问题及解决方法
    Python中异常处理的常见问题及解决方法引言:在编写程序时,很难避免出现各种各样的错误和异常。异常处理是一种机制,可以在程序运行时捕获和处理这些异常,从而保证程序的稳定性和可靠性。在Python中,异常处理是一项非常重要的技能,本文将介绍...
    99+
    2023-10-22
    异常处理 (Exception Handling) 解决方法 (Solutions) 常见问题 (Common Prob
  • WCF常见异常问题的解决方法
    这篇文章主要讲解了“WCF常见异常问题的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF常见异常问题的解决方法”吧!WCF还是比较常用的,于是我研究了一下WCF,在这里拿出来和大...
    99+
    2023-06-17
  • 常见CentOS配置失败的问题及解决方法
    这篇文章主要讲解了“常见CentOS配置失败的问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常见CentOS配置失败的问题及解决方法”吧!当CentOS配置失败时,也许你对失败...
    99+
    2023-06-16
  • Navicat连接MySQL教程及常见问题解决方法
    “Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理不同类型的数据库,Navicat 的功能足以满足专业开发人员的所有需求,对数据库服务器初学者来说又简单易操作。且Navicat 的用户界面设计良好应用广泛。 目录 一...
    99+
    2023-10-20
    mysql 数据库 sql 大数据
  • CSS使用中常见的问题以及解决方法
    这篇文章主要介绍“CSS使用中常见的问题以及解决方法”,在日常操作中,相信很多人在CSS使用中常见的问题以及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS使用中...
    99+
    2022-10-19
  • 使用stream的Collectors.toMap()方法常见的问题及解决
    目录使用stream的Collectors.toMap()方法常见问题在使用过程中有两个小坑需要注意解决方案Stream ToMap(Collectors.toMap) 实践Requ...
    99+
    2023-03-06
    stream Collectors.toMap() Collectors.toMap()方法 使用stream Collectors.toMap()方法
  • PHP与MySQL索引的常见问题及解决方法
    引言:在使用PHP开发网站应用程序时,经常会涉及到与数据库的交互操作,而MySQL作为开发者最常用的数据库之一,索引的优化对于提高查询效率起着至关重要的作用。本文将介绍PHP与MySQL索引的常见问题,并给出相应的解决方法,同时提供具体的代...
    99+
    2023-10-21
  • win10系统常见问题及解决方法有哪些
    在使用Windows 10操作系统时,常见的问题及解决方法包括:1. 无法启动系统:可以尝试使用Windows 10安装盘修复系统启...
    99+
    2023-08-26
    win10
  • Linux运维常见问题及解决方法是什么
    Linux运维常见问题及解决方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。作为linux运维,多多少少会碰见这样那样的问题或故障,从中总结经验,查找问题,汇总并分析故...
    99+
    2023-06-16
  • Python中GUI编程中常见的问题及解决方法
    Python中GUI编程中常见的问题及解决方法GUI(图形用户界面)编程是指通过可视化界面来与用户进行交互的编程方式。Python提供了多种GUI编程库,如Tkinter、PyQt等,使开发者可以快速构建出漂亮、交互性强的应用程序。然而,在...
    99+
    2023-10-22
    问题 解决方法 关键词:GUI编程
  • C#中常见的线程同步问题及解决方法
    C#中常见的线程同步问题及解决方法引言:在多线程编程中,线程同步是一个关键的概念。当多个线程同时访问共享资源时,会导致数据不一致或出现竞态条件等问题。本文将介绍C#中常见的线程同步问题,并提供相应的解决方法和示例代码。一、不正确的数据共享当...
    99+
    2023-10-22
    线程同步问题 C#中的线程同步
  • win8中IE10 Metro版常见问题及解决方法汇总
    如何在IE10中使用收藏夹 在 Windows 8 Consumer Preview 中使用IE收藏夹与使用之前版本的传统收藏夹不同。您可以将网站锁定至开始屏幕,或使用“新建选项卡”打开锁定的站点...
    99+
    2023-06-03
    win8 IE10 Metro 解决 问题 方法
  • SpringBoot工程下使用OpenFeign常见问题及解决方法
    这篇文章主要讲解了“SpringBoot工程下使用OpenFeign常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot工程下使用OpenFeign常见问题及...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作