访问我的过滤器中的 NameBinding 值

Access NameBinding value inside my filter

我有一个用于我的 REST 服务的过滤器。普通身份验证过滤器。

现在我需要向其中传递一个布尔值。从这个 link 我得到了这一点:

@NameBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface AuthenticationFilterBinding {

    boolean checkAccountStatus() default true;
}

在我的过滤器实现中,我:

@AuthenticationFilterBinding
@Provider
@Priority(FilterPriority.AUTHENTICATION_PRIORITY)
public class AuthenticationFilter extends AuthenticationAbstractFilter implements ContainerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);

    @Override
    public void filter(ContainerRequestContext requestContext) {

    // Here I need to check the value of checkAccountStatus() defined in the code above.

    // How can I access that value?

    // My filter logic goes here
    }
}

在我的端点上,我有类似的东西:

@POST
@Path("/photo")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@AuthenticationFilterBinding(checkAccountStatus = false)
@ManagedAsync
public void setUserPhoto(@Suspended AsyncResponse ar, @FormDataParam("image") InputStream fileStream, @HeaderParam(Constant.HEADER_USER_ID) long userId) { 
    // ...
}

我的问题是我需要检查过滤器中 checkAccountStatus 的值,这就是我的问题,我该如何访问它?

我找到了解决方案:

在过滤器中使用反射来访问值。像这样:

public void filter(ContainerRequestContext requestContext) {

        final ExtendedUriInfo extendendUriInfo = (ExtendedUriInfo) requestContext.getUriInfo();

        boolean checkAccountStatus = extendendUriInfo
                                                    .getMatchedResourceMethod()
                                                    .getInvocable()
                                                    .getHandlingMethod()
                                                    .getAnnotation(AuthenticationFilterBinding.class).checkAccountStatus();
}

希望这对某人有所帮助。

注意,这是使用反射,而反射。我不会在大过滤器上使用它(比如身份验证,你几乎可以在任何地方使用的过滤器)......它会减慢你的 app/website.

我最终为那个特定案例创建了一个新过滤器。这是一个权衡。