Quarkus Reactive环境下,如何在Resteasy过滤器中识别JAX-RS方法注解
解决Quarkus 3.6.1中Reactive RESTEasy过滤器获取端点HTTP方法注解的问题
方法1:使用io.quarkus.resteasy.reactive.server.spi.ResteasyReactiveResourceInfo替代ResourceInfo
在Reactive版本中,原JAX-RS的ResourceInfo无法正常获取方法注解,你可以注入Quarkus提供的Reactive专属ResteasyReactiveResourceInfo来获取资源方法的完整信息:
import io.quarkus.resteasy.reactive.server.spi.ResteasyReactiveResourceInfo; import jakarta.ws.rs.container.ContainerResponseFilter; import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.container.ContainerResponseContext; import jakarta.ws.rs.ext.Provider; import jakarta.ws.rs.POST; @Provider public class MyResponseFilter implements ContainerResponseFilter { private final ResteasyReactiveResourceInfo resourceInfo; // 构造注入(Quarkus推荐使用构造注入) public MyResponseFilter(ResteasyReactiveResourceInfo resourceInfo) { this.resourceInfo = resourceInfo; } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { // 获取当前资源方法 var resourceMethod = resourceInfo.getResourceMethod(); // 检查是否带有POST注解 boolean isPostMethod = resourceMethod.isAnnotationPresent(POST.class); // GET、PUT等其他HTTP方法注解的判断逻辑同理 if (isPostMethod) { // 执行你的业务逻辑 } } }
方法2:从ContainerRequestContext直接获取请求方法
如果仅需要判断当前请求的HTTP方法类型,无需直接操作方法注解,可以直接从请求上下文获取:
@Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { String httpMethod = requestContext.getMethod(); if ("POST".equalsIgnoreCase(httpMethod)) { // 执行你的业务逻辑 } }
这种方式更轻量,适合仅需判断请求方法类型的场景。
注意事项
- 确保过滤器类标注
@Provider注解,且被Quarkus扫描到(比如放在@ApplicationPath类的同包/子包下,或通过@RegisterProvider手动注册)。 ResteasyReactiveResourceInfo是Quarkus Reactive RESTEasy的专属API,与原JAX-RS的ResourceInfo不兼容,迁移后需替换使用。
内容的提问来源于stack exchange,提问作者ginccc
相关产品推荐
相关产品推荐

