如何在Jersey 2.4过滤器中获取资源注释?

时间:2014-01-06 09:31:54

标签: java filter annotations jersey

我的问题与此问题基本相同:How can I get resource annotations in a Jersey ContainerResponseFilter

但是我使用Java Jersey 2.4并且找不到ResourceFilterFactory或ResourceFilter类的任何标志。文档也没有提到它们。他们被弃用了还是真的被隐藏了?如果他们已被弃用,我可以使用什么呢?现在有一种方法可以使用Jersey 2.4和2.5从ContainerRequestFilter获取资源注释吗?

由于

1 个答案:

答案 0 :(得分:18)

如果您想根据资源方法/类上可用的注释修改请求的处理,那么我建议您使用JAX-RS 2.0中的DynamicFeature。使用DynamicFeature,您可以为可用资源方法的子集分配特定提供程序。例如,考虑我有一个类似的资源类:

@Path("helloworld")
public class HelloWorldResource {

    @GET
    @Produces("text/plain")
    public String getHello() {
        return "Hello World!";
    }
}

我想为其分配ContainerRequestFilter。我会创建:

@Provider
public class MyDynamicFeature implements DynamicFeature {

    @Override
    public void configure(final ResourceInfo resourceInfo, final FeatureContext context) {
        if ("HelloWorldResource".equals(resourceInfo.getResourceClass().getSimpleName())
                && "getHello".equals(resourceInfo.getResourceMethod().getName())) {
            context.register(MyContainerRequestFilter.class);
        }
    }
}

registration之后(如果您正在使用包扫描,那么您不需要注册它以防其上有@Provider注释)MyContainerRequestFilter将与您的关联资源方法。

另一方面,您始终可以在过滤器中注入ResourceInfo(无法使用@PreMatching进行注释)并从中获取注释:

@Provider
public class MyContainerRequestFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(final ContainerRequestContext requestContext) throws IOException {
        resourceInfo.getResourceMethod().getDeclaredAnnotations();
    }
}