Java 未为子资源调用JAX-RS DynamicFilter

Java 未为子资源调用JAX-RS DynamicFilter,java,rest,jax-rs,cxf,Java,Rest,Jax Rs,Cxf,根据文件,应可用于资源和子资源。作为一种效果,我希望在调用子资源端点时注册并调用过滤器-ieGET/some/sub/x。但是,以下方法不适用于我(或其他类似方法): 注释 @NameBinding @目标({方法,类型}) @保留(RetentionPolicy.RUNTIME) public@interface SomeFilterAnn{} 资源 @SomeFilterAnn @路径(“/some”) 公共类资源{ @得到 公共字符串getSome(){ 返回“一些”; } @路径(“

根据文件,应可用于资源和子资源。作为一种效果,我希望在调用子资源端点时注册并调用过滤器-ie
GET/some/sub/x
。但是,以下方法不适用于我(或其他类似方法):

  • 注释

    @NameBinding
    @目标({方法,类型})
    @保留(RetentionPolicy.RUNTIME)
    public@interface SomeFilterAnn{}
    
  • 资源

    @SomeFilterAnn
    @路径(“/some”)
    公共类资源{
    @得到
    公共字符串getSome(){
    返回“一些”;
    }
    @路径(“/sub”)
    公共子资源getSub(){
    返回新的子资源();
    }
    @SomeFilterAnn
    @路径(“/x”)
    公共静态类子资源{
    @得到
    公共字符串getSome(){
    返回“sub”;
    }
    }
    }
    
  • 过滤器(它实际上更复杂,由
    DynamicFilter
    配置)

    @SomeFilterAnn
    公共类SomeFilter实现ContainerRequestFilter{
    私有静态最终记录器LOG=LoggerFactory.getLogger(SomeFilter.class);
    @凌驾
    公共无效筛选器(ContainerRequestContext requestContext)引发IOException{
    LOG.info(“被调用的过滤器”);
    }
    }
    
  • 这里是
    DynamicFeature
    ,我想为资源和子资源注册过滤器。实际上,我希望
    configure()
    也会为
    SubResource
    调用
    resourceInfo.getResourceClass()==SubResource.class
    ,但无法实现这一点

    @Provider
    公共类SomeDynamicFeature实现了DynamicFeature{
    私有静态最终记录器LOG=LoggerFactory.getLogger(SomeDynamicFeature.class);
    @凌驾
    公共void配置(ResourceInfo ResourceInfo、FeatureContext上下文){
    Class resourceClass=resourceInfo.getResourceClass();
    //这很有效
    if(resourceClass==SomeResource.class){
    LOG.info(“注册资源过滤器”);
    register(新的SomeFilter(/*someconfig*/);
    }
    //这不起作用(未为子资源调用)
    if(resourceClass==SomeResource.SubResource.class){
    LOG.info(“注册资源过滤器”);
    register(新的SomeFilter(/*someconfig*/);
    }
    //这也不起作用(未为子资源调用筛选器)
    if(resourceInfo.getResourceMethod().getReturnType()==SomeResource.SubResource.class){
    LOG.info(“注册子资源过滤器”);
    register(新的SomeFilter(/*someconfig*/);
    }
    }
    }
    
我在WildFly 8.2上运行这个程序,有CXF,没有Jersey或RESTEasy

编辑


我发现用
@Provider
注释
SomeFilter
可以让filter不需要
DynamicFeature
就可以工作,但是我不知道如何配置我的filter-这里是关于它的。

试试
方法。getDeclaringClass()
。资源方法永远不会使用定位器,因此最后一个
if
是无用的。我猜资源类始终是父资源,这就是为什么从不调用第二个。但是resource方法可以在子资源中,因此检查方法的声明类是否应该工作。只是一个理论。我希望
resourceInfo.getResourceMethod().getDeclaringClass()==resourceInfo.getResourceClass()
。实际上,我记录了DynamicFeature.configure()的所有调用,并且没有对
子资源
类的调用。