未为子资源调用 JAX-RS DynamicFilter

2023-12-27

根据文档,应该可以使用DynamicFeature https://docs.oracle.com/javaee/7/api/javax/ws/rs/container/DynamicFeature.html对于资源和子资源。作为效果,我希望每当调用子资源端点时都会注册和调用过滤器 - 即GET /some/sub/x。但是以下对我不起作用(也不适合其他类似的方法):

  • 注解

    @NameBinding
    @Target({METHOD, TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SomeFilterAnn {}
    
  • resource

    @SomeFilterAnn
    @Path("/some")
    public class SomeResource {
      @GET
      public String getSome() {
        return "some";
      }
    
      @Path("/sub")
      public SubResource getSub() {
        return new SubResource();
      }
    
      @SomeFilterAnn
      @Path("/x")
      public static class SubResource {
        @GET
        public String getSome() {
          return "sub";
        }
      }
    }
    
  • 过滤器(它实际上更复杂并且配置为DynamicFilter)

    @SomeFilterAnn
    public class SomeFilter implements ContainerRequestFilter {
      private static final Logger LOG = LoggerFactory.getLogger(SomeFilter.class);
    
      @Override
      public void filter(ContainerRequestContext requestContext) throws IOException {
        LOG.info("filter called");
      }
    }
    
  • here is DynamicFeature我想注册资源和子资源的过滤器。其实我希望configure()也会被要求SubResource so resourceInfo.getResourceClass() == SubResource.class但无法实现这一点。

    @Provider
    public class SomeDynamicFeature implements DynamicFeature {
      private static final Logger LOG = LoggerFactory.getLogger(SomeDynamicFeature.class);
    
      @Override
      public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        Class<?> resourceClass = resourceInfo.getResourceClass();
    
        // this works
        if (resourceClass == SomeResource.class) {
          LOG.info("register resource filter");
          context.register(new SomeFilter(/*some config*/));
        }
    
        // this does not work (not called for Subresource)
        if (resourceClass == SomeResource.SubResource.class) {
          LOG.info("register resource filter");
          context.register(new SomeFilter(/*some config*/));
        }
    
        // this also does not work (filter not called for Subresource)
        if (resourceInfo.getResourceMethod().getReturnType() == SomeResource.SubResource.class) {
          LOG.info("register subresource filter");
          context.register(new SomeFilter(/*some config*/));
        }
      }
    }
    

我在 WildFly 8.2 上使用 CXF 运行此程序,但没有 Jersey 或 RESTEasy

EDIT

我发现注释SomeFilter with @Provider允许过滤器工作而无需DynamicFeature但是我不知道如何配置我的过滤器 - 这是单独的问题 https://stackoverflow.com/questions/33329853/how-can-i-provide-configuration-to-jax-rs-provider-annotated-containerrequestfi关于它。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未为子资源调用 JAX-RS DynamicFilter 的相关文章

随机推荐