访问我的过滤器

时间:2015-05-29 16:17:45

标签: java rest java-ee java-ee-7

我的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的值,这是我的问题,如何访问它?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

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

public void filter(ContainerRequestContext requestContext) {

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

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

希望这可以帮助某人。

注意,这是使用反射和反射。我不会在大过滤器上使用它(比如身份验证,几乎无处不在的过滤器)......它会减慢你的应用程序/网站的速度。

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