• springboot使用@ControllerAdvice(二)之深入理解


    前言:

    接口类项目开发时,为了便于后期查找问题,一般会拦截器或过滤器中记录每个接口请求的参数与响应值记录,
    请求参数很容易从request中获取,但controller的返回值无法从response中获取,有一个简单的方法,在controller接口的最后将返回值保存到request域中,这种方法虽然简单,但是开发起来太麻烦,需要在每个controller的最后添加一行代码,且该功能不属于业务功能,不应该接口中去实现,应该有个全局的处理方法。
     
    ControllerAdvice是springmvc controller增强器
     
    ControllerAdvice三个用处:
    1. ModelAttribute: 暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
    2. InitBinder : 用于自定义@RequestMapping 方法参数绑定
    3. ResponseBodyAdvice : 用于@ResponseBody返回值增加处理
    ControllerAdvice初始化:
    Spring mvc 启动时调用RequestMappingHandlerAdapter类的initControllerAdviceCache()方法进行初始化
     
    ResponseBodyAdvice : 可以对@ResponseBody的返回值进行加工处理,它是一个接口类,具体处理可以自定义实现类注入到responseBodyAdviceBeans中既可,注入过程由RequestMappingHandlerAdapter类的initControllerAdviceCache去做,开发者只需要自定义实现类实现ResponseBodyAdvice 接口并添加类注解@ControllerAdvice
     

    ResponseBodyAdvice

    ResponseBodyAdvice是spring4.1的新特性,其作用是在响应体写出之前做一些处理;比如,修改返回值、加密等。

    我在项目中的用到@ControllerAdvice,ResponseBodyAdvice来做一个Controller增强器,将Controller接口的响应(Response)放到请求上下文中 。

      介绍:https://blog.csdn.net/u012852374/article/details/53837156

    项目中Controller增强器:

    复制代码
    import org.springframework.core.MethodParameter;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    import com.generalichina.wolong.base.BaseResponse;
    
    @ControllerAdvice
    public class ResponseAdvisor implements ResponseBodyAdvice<Object> {
    
        /**
         * 判断支持的类型 
         */
        @Override
        public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
         //注意,这里必须返回true,否则不会执行beforeBodyWrite方法 
            return true;
        }
    
        /**
         * 过滤
         * 
         */
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
                ServerHttpResponse response) {
    
            String requestPath = request.getURI().getPath();// 普通response不进行过滤
            if (!requestPath.startsWith("/credit")) {
                return body;
            }
    
            //如果是返回客户端模板类不进行过滤
            if (body instanceof BaseResponse) {
                return body;
            }
    
            return new BaseResponse(body);
        }
    
    }

    RequestBodyAdvice和ResponseBodyAdvice

  • 相关阅读:
    递推 hdu 1396
    递推 hdu 3411
    Eclipse中git上如何把自己的分支保存到远端
    api-gateway-engine知识点(1)
    Java知识点ArrayList
    如何利用VMware安装XP系统
    IOP知识点(1)
    Eclipse如何导入DemoWeb.rar
    mysql忘记root密码
    实习培训——Java多线程(9)
  • 原文地址:https://www.cnblogs.com/sjqq/p/10103198.html
Copyright © 2020-2023  润新知