Java 未为子资源调用JAX-RS DynamicFilter
根据文件,应可用于资源和子资源。作为一种效果,我希望在调用子资源端点时注册并调用过滤器-ieJava 未为子资源调用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(){ 返回“一些”; } @路径(“
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*/); } } }
我发现用
@Provider
注释SomeFilter
可以让filter不需要DynamicFeature
就可以工作,但是我不知道如何配置我的filter-这里是关于它的。试试方法。getDeclaringClass()
。资源方法永远不会使用定位器,因此最后一个if
是无用的。我猜资源类始终是父资源,这就是为什么从不调用第二个。但是resource方法可以在子资源中,因此检查方法的声明类是否应该工作。只是一个理论。我希望resourceInfo.getResourceMethod().getDeclaringClass()==resourceInfo.getResourceClass()
。实际上,我记录了DynamicFeature.configure()的所有调用,并且没有对子资源
类的调用。