Java 在JAXR中,容器请求拦截器仅应用于特定的提供者
使用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)无法绑定到资源 方法 拦截器类定义为: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提供程序的给定
@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());
}
}
}