Spring MVC:动态添加已弃用端点的响应头

wecizke3  于 12个月前  发布在  Spring
关注(0)|答案(2)|浏览(108)

假设我有一个标记为deprecated的端点:

@RestController
class MyController {

    @GetMapping("/api/hello")
    @Deprecated(forRemoval = true)
    public String hello() {
        return "Hello, world";
    }
}

字符串
我也使用SpringDoc来生成OpenAPI规范。因此,这个端点在规范中也应该被标记为已弃用(由于@Deprecated注解的存在)。
我想添加一个MVC过滤器,如果端点被弃用,它会添加自定义响应头X-Deprecated。所以,客户端会知道它正在使用一些弃用的端点。
你有什么想法如何实现它?我知道@Deprecated注解有RUNTIME保留策略,我可以用反射API解析它。但是,我不知道如何制定通用的解决方案。

n9vozmp4

n9vozmp41#

您可以在拦截器中使用Object handler

public class LoggerInterceptor implements HandlerInterceptor {

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod method = (HandlerMethod) handler;

            if (method.getMethod().getAnnotation(Deprecated.class) != null) {
                response.addHeader("X-Deprecated", "true");
            }
        }
    }
}

字符串
然后注册到WebMvcConfigurer

@Bean
    public WebMvcConfigurer webConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new LoggerInterceptor());
            }
        };
    }

ztyzrc3y

ztyzrc3y2#

您可以使用 Spring AOP@Deprecated annotation上创建@After Pointcut。在方法执行中,然后您可以添加所需的header
如果你需要更多关于 AOP 的信息,请查看:Implementing a Custom Spring AOP Annotation

相关问题