我的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
的值,这是我的问题,如何访问它?
答案 0 :(得分:0)
我找到了解决方案:
在过滤器中使用反射来访问该值。像这样:
public void filter(ContainerRequestContext requestContext) {
final ExtendedUriInfo extendendUriInfo = (ExtendedUriInfo) requestContext.getUriInfo();
boolean checkAccountStatus = extendendUriInfo
.getMatchedResourceMethod()
.getInvocable()
.getHandlingMethod()
.getAnnotation(AuthenticationFilterBinding.class).checkAccountStatus();
}
希望这可以帮助某人。
注意,这是使用反射和反射慢。我不会在大过滤器上使用它(比如身份验证,几乎无处不在的过滤器)......它会减慢你的应用程序/网站的速度。
我最终为这个特定案例创建了一个新的过滤器。这是一种权衡。