zoukankan      html  css  js  c++  java
  • [Spring Boot]使用自定义注解统一请求返回值

    使用自定义注解统一请求返回值

    自定义一个注解,用于标记需要重写返回值的方法/类

    package com.timee.annotation;
    
    import java.lang.annotation.*;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Documented
    public @interface ResponseData {
    }
    

    使用拦截器拦截所有请求

    创建拦截器

    public class ResponseInterceptor implements HandlerInterceptor {
        public static final String RESPONSE_DATA_REWRITE = "RESPONSE_DATA_REWRITE";
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (handler instanceof HandlerMethod) {
                final HandlerMethod handlerMethod = (HandlerMethod) handler;
                final Class<?> clazz = handlerMethod.getBeanType();
                final Method method = handlerMethod.getMethod();
                if (clazz.isAnnotationPresent(ResponseData.class)) {
                    request.setAttribute(RESPONSE_DATA_REWRITE, clazz.getAnnotation(ResponseData.class));
                } else if (method.isAnnotationPresent(ResponseData.class)) {
                    request.setAttribute(RESPONSE_DATA_REWRITE, method.getAnnotation(ResponseData.class));
                }
            }
            return true;
        }
    }
    

    应用拦截器到项目

    @Configuration
    public class WebMvcConfiguration implements WebMvcConfigurer {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new ResponseInterceptor())
                    .addPathPatterns("/**");
        }
    }
    

    重写返回值

    @ControllerAdvice
    public class ResponseHandler implements ResponseBodyAdvice {
        public static final String RESPONSE_DATA_REWRITE = "RESPONSE_DATA_REWRITE";
    
        @Override
        public boolean supports(MethodParameter methodParameter, Class aClass) {
            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = servletRequestAttributes.getRequest();
            return request.getAttribute(RESPONSE_DATA_REWRITE) == null ? false : true;
        }
    
        @Override
        public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
            log.info("请求[{}]需要重写返回值格式", serverHttpRequest.getURI());
            return "你好,世界!";
        }
    }
    

    测试请求

    @Controller
    public class Controller {
        @GetMapping("/test")
        @ResponseBody
        @ResponseData
        public String test() {
            return "Hello World!";
        }
    }
    

    运行结果

    在这里插入图片描述
    在这里插入图片描述

    转自:https://blog.csdn.net/snowiest/article/details/112102772?utm_medium=distribute.pc_category.none-task-blog-hot-5.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-5.nonecase

  • 相关阅读:
    用户使用调查报告
    Beta阶段敏捷冲刺五
    Beta阶段敏捷冲刺四
    Beta阶段敏捷冲刺三
    Beta阶段敏捷冲刺二
    Beta阶段敏捷冲刺一
    软工网络15团队作业8——Beta阶段敏捷冲刺
    Beta阶段Scrum 冲刺博客合集
    软工网络15Alpha阶段敏捷冲刺博客集合
    项目复审——Beta阶段
  • 原文地址:https://www.cnblogs.com/coder-ahao/p/14225295.html
Copyright © 2011-2022 走看看