在 JAXRS 中仅将容器请求拦截器应用于特定提供者

In JAXRS apply a container request interceptor to a specific provider only

使用 JAXRS-2.0(特别是 Jersey 2.2)我正在尝试将请求拦截器应用于特定的资源提供者 class(在第 3 方库中),显然我正在做它错了。我收到以下错误 - 我对原因有点困惑。最终效果是拦截器在每个提供者而不是 1 个提供者的每个请求上被调用。这是错误:

2017-11-26 10:43:51.061 [localhost-startStop-1][WARN][o.g.j.server.model.ResourceMethodConfig] - The given contract (interface javax.ws.rs.container.DynamicFeature) of class com.idfconnect.XYZ provider cannot be bound to a resource method.

拦截器class定义为:

@Provider
public class XYZ implements WriterInterceptor, DynamicFeature {

在我的 ResourceConfig 中,我正在为特定提供者注册拦截器,如下所示(我怀疑这是我误入歧途的地方):

@ApplicationPath("service")
public class MyApp extends ResourceConfig {
  public MyApp() {
    ResourceConfig rc = register(SomeThirdPartyResource.class);
    rc.register(XYZ.class);
    ...

有人能帮我弄清楚如何将拦截器绑定到 SomeThirdPartyResource class 吗?

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

您应该为 DynamicFeature 创建一个单独的 class 并在 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 并让它确定绑定到哪个资源。