public class MyApplication extends ResourceConfig {
public MyApplication() {
/* // Register resources and providers using package-scanning.
packages("com.keylesson.service");
// Register my custom provider - not needed if it's in my.package.
register(TestFilter.class);
register(TestFilter2.class);*/
}
}
取消注释后的上述代码能够执行两个过滤器类,但顺序是 TestFilter2,然后是 TestFilter。我不太喜欢这种 Resourceconfig 方法,我想为 Jersey2.3 使用旧式 web.xml。用于过滤器的 jersey 1.x init-params 在 jersey2.3 中不起作用。任何人都可以帮我提供 jersey2.3 的示例 web.xml 以保证过滤器的执行吗?并且还在序列 testfilter 中,然后是 testfilter2?
最佳答案
您可以为过滤器配置优先级。几个选项
选项 1:
使用 @Priority
对于您的过滤器类,传入一个值(例如 @Priority(1)
)。数字越小,优先级越高(不需要在 web.xml 或 Application 子类中做任何特殊的事情)
@Priority(6000)
public class MyFilter1 ... {}
@Priority(6001)
public class MyFilter2 ... {}
参见 Priorities
选项 2:
通过可注入(inject)的 Configurable
以编程方式将其配置到应用程序中.有点像
@ApplicationPath("/")
public class MyApplication extends Application {
public MyApplication(@Context Configurable configurable) {
configurable.register(MyFilter1.class, 1000);
configurable.register(MyFilter2.class, 1001);
}
}
或者使用 ResourceConfig
简单地调用 register
而不注入(inject) Configurable
。参见重载的 API register
public ResourceConfig register(Object component, int bindingPriority)
例如
public class MyApplication extends ResourceConfig {
public MyApplication() {
...
register(TestFilter.class, 6000);
register(TestFilter2.class, 6001);*/
}
}
注意事项:
仅供引用,Priorites
中有内置常量类。
public final class Priorities {
private Priorities() { }
public static final int AUTHENTICATION = 1000;
public static final int AUTHORIZATION = 2000;
public static final int HEADER_DECORATOR = 3000;
public static final int ENTITY_CODER = 4000;
public static final int USER = 5000;
}
这些由框架的一些内置组件使用,因此您在为优先级指定数字时可能需要考虑这些。你可以像这样使用它们
@Priority(Priorities.USER)
// or @Priority(Priorities.USER + 1)
public class MyFilter ... {}
关于java - Jersey 2.3 为 ContainerRequestFilter 设置优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26989608/