在 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
并让它确定绑定到哪个资源。
使用 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
并让它确定绑定到哪个资源。