java - 如何让 ContainerRequestFilter 过滤多个注释,但在 Java 中一次过滤 1 个注释?

标签 java jakarta-ee jersey jax-rs jersey-2.0

我创建了一个ContainerRequestFilter,但是当我添加两个注释时,要在任何方法上调用它,该方法都需要两个注释。我想要的是这样的:

提供商:

@TypeA
@TypeB
@Provider
@Priority( Priorities.AUTHENTICATION )
public class AuthenticationFilter implements ContainerRequestFilter
{ ... }

一些被过滤的类:

@Path( "/test" )
public class TestStuff
{
    @POST
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "auth" )
    @TypeA
    public Response login() { ... }

    @POST
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "auth" )
    @TypeB
    public Response somethingElse() { ... }

}

但这不起作用。仅当我这样做时它才有效:

@Path( "/test" )
public class TestStuff
{
    @POST
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "auth" )
    @TypeA
    @TypeB
    public Response login() { ... }

    @POST
    @Produces( MediaType.APPLICATION_JSON )
    @Path( "auth" )
    @TypeA
    @TypeB
    public Response somethingElse() { ... }

}

如何使过滤器匹配类型的“OR”?

最佳答案

而不是 Name Binding ,您可以使用 Dynamic Binding 。您只需要实现一个DyanamiCFeature,并检查该方法是否具有注释,以确定是否应该为该方法注册过滤器。

public class AuthDynamicFeature implements DynamicFeature {

    @Override
    public void configure(ResourceInfo info, FeatureContext context) {
        Method method = info.getResourceMethod();
        if (method.isAnnotationPresent(TypeA.class)
            || method.isAnnotationPresent(TypeB.class)) {

            context.register(new AuthenticationFilter());
            // or context.register(AuthenticationFilter.class);
        }
    }
}

然后只需向应用程序注册该功能即可。或者,如果您在该功能上添加 @Provider,并且启用了包/类路径扫描,它将自动注册。

关于java - 如何让 ContainerRequestFilter 过滤多个注释,但在 Java 中一次过滤 1 个注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44465282/

相关文章:

java - 对目录结构有点困惑

java - Spring Boot 1.4.2 @WebMvcTest 返回状态 404

java - WebTarget 和线程安全

java - 如何在 jersey WriterInterceptor 实现中获取 @interface 参数

java - 如何在 Java 中模拟 System.in(除了在 Junit 测试用例中使用)?

jakarta-ee - 如何在每次发出 HTTP 请求时获取用户日期

java - 计算 Java 函数的签名

JEE7 中的 Tomcat 服务器不可用

java - 为什么Java中String被设计成Class/Object,占用资源较多

Java - 本地类和泛型,为什么编译器警告?