java - Jersey 2.3 为 ContainerRequestFilter 设置优先级

标签 java jersey jax-rs web.xml jersey-2.0

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/

相关文章:

休息 - Jersey.Client 将@SecurityContext 传递给服务器

java - 无法使用 JAX-RS Jersey 2.3.1 和 Tomcat 7 使 ChunkedOutput 工作

java - 一行三个textView

java - 同时在 Selenium 中运行多个测试用例

java - elastic search not x 内容异常

rest - Atmosphere Jersey - 服务器消息

java - 有没有办法在 Dropwizard/Jersey 中注册整个模块?

jakarta-ee - 无法从 ExceptionMapper 捕获 ConstaintValidationException

jax-rs - MessageBodyWriter 未找到 从 fatjar 运行时出错

java - Maven Tomcat 插件更改端口