Java 在JAXR中,容器请求拦截器仅应用于特定的提供者

Java 在JAXR中,容器请求拦截器仅应用于特定的提供者,java,jax-rs,jersey-2.0,Java,Jax Rs,Jersey 2.0,使用JAXRS-2.0(特别是Jersey 2.2),我试图将请求拦截器应用于特定的资源提供程序类(位于第三方库中),但显然我做得不对。我得到下面的错误-我有点困惑的原因。最终的效果是,在每个提供者的每个请求上都会调用拦截器,而不是1提供者。这就是错误: 2017-11-26 10:43:51.061 [localhost-startStop-1][WARN][o.g.j.server.model.ResourceMethodConfig] -类com.idfconnect.XYZ提供程序的给定

使用JAXRS-2.0(特别是Jersey 2.2),我试图将请求拦截器应用于特定的资源提供程序类(位于第三方库中),但显然我做得不对。我得到下面的错误-我有点困惑的原因。最终的效果是,在每个提供者的每个请求上都会调用拦截器,而不是1提供者。这就是错误:

2017-11-26 10:43:51.061 [localhost-startStop-1][WARN][o.g.j.server.model.ResourceMethodConfig] -类com.idfconnect.XYZ提供程序的给定约定(接口javax.ws.rs.container.DynamicFeature)无法绑定到资源 方法

拦截器类定义为:

@Provider
public class XYZ implements WriterInterceptor, DynamicFeature {
在我的ResourceConfig中,我正在为特定的提供者注册拦截器,如下所示(我怀疑这就是我误入歧途的地方):


有人能帮我找出如何仅将拦截器绑定到第三方资源类吗?

你不应该让你的提供者实现
动态功能。这可能是警告的原因。您正在尝试注册拦截器,它也是一个
DynamicFeature
,Jersey告诉您
DynamicFeature
不是应该注册到方法的东西

您应该为
DynamicFeature
创建一个单独的类,并在
configure
中检查要将提供者附加到的资源(使用
ResourceInfo
,然后相应地注册它。例如

class XYZ implements DynamicFeature {
    @Override
    public void configure(ResourceInfo info, FeatureContext ctx) {
       if (info.getResourceClass().equals(ThirdPartyResource.class) {
           ctx.register(YourWriterImplementation.class);
           // or
           ctx.register(new YourWriterImplementation());
       }
    }
}

您获得拦截器命中的所有资源的原因是,您正在使用
ResourceConfig
注册拦截器。这将附加所有资源。您只需注册
DynamicFeature
并让它确定要绑定到哪个资源。

这非常有效,谢谢!我拆分了DynamicFeature从拦截器提供程序转换为一个单独的类,现在一切正常
class XYZ implements DynamicFeature {
    @Override
    public void configure(ResourceInfo info, FeatureContext ctx) {
       if (info.getResourceClass().equals(ThirdPartyResource.class) {
           ctx.register(YourWriterImplementation.class);
           // or
           ctx.register(new YourWriterImplementation());
       }
    }
}