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

rud*_*lfv 9 java annotations jersey filter

我的问题与此问题基本相同:我如何在Jersey ContainerResponseFilter中获取资源注释.

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

谢谢

Mic*_*dos 18

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

@Path("helloworld")
public class HelloWorldResource {

    @GET
    @Produces("text/plain")
    public String getHello() {
        return "Hello World!";
    }
}
Run Code Online (Sandbox Code Playgroud)

我想为它分配一个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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注册后(如果您正在使用包扫描,那么您不需要注册它以防它上面有@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果可能,请使用Jersey 2.5.1或使用2.4中的@Context javax.inject.Provider <ResourceInfo>注入ResourceInfo(这在2.5中已得到修复). (2认同)