【问题标题】:How to set priorities and annotations on Jersey filters如何在 Jersey 过滤器上设置优先级和注释
【发布时间】:2015-04-30 13:09:57
【问题描述】:

想象一下两个过滤器和注释如下:

@Provider
@ToTokenFilter
@Priority(1000)
public class TokenFilter implements ContainerRequestFilter {
  @Override
  public void filter() {
    // to do
  }
}

@Provider
@ToRootFilter
@Priority(2000)
public class RootFilter implements ContainerRequestFilter {
  @Override
  public void filter() {
    // to do
  }
}

@NameBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ToTokenFilter {}

@NameBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ToRootFilter {}

我正在尝试在课程中使用此过滤器,例如:

@Path("/users")
@ToTokenFilter
@ToRootFilter
public class Users {
  @GET
  public String getUsers() {
    //to do
  }
}

这样,我的代码永远不会进入我的 TokenFilter,如果我删除了@ToRootFilter,它最终会进入。但我两个都需要!我需要在 RootFilter 之前调用 TokenFilter。这就是为什么我确实设置了优先级,我试图将价值观的优先级放在两个方面,但没有任何效果。

我尝试将@ToTokenFilter 放在类上,将@ToRootFilter 放在方法上,但仍然是同样的问题。

有人知道如何在 Jersey 中使用具有优先级和注释的多个过滤器吗?

编辑

这里是 web.xml

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>filters.TokenFilter;filters.RootFilter</param-value>
</init-param>

【问题讨论】:

  • 仅供参考,看起来您使用的是 Jersey 2.x,所以您的 &lt;init-param&gt; 没用。这是一个 1.x 属性
  • 我无法重现该问题。它对我来说按预期工作。我为测试使用了一个依赖项jersey-container-servlet - 2.16。您能否发布您的依赖项,以及您测试过但不起作用的真实示例,以及导入语句和完整的 web.xml。这是很奇怪的行为,我想看看是什么原因造成的
  • 刚刚发布了解决方案的答案,感谢您的关注

标签: java jersey


【解决方案1】:

我终于找到问题了:

我正在导入:

import com.sun.jersey.core.util.Priority;

而不是

import javax.annotation.Priority;

但是 jersey 使用 java Priority 注释来设置过滤器的优先级。

默认情况下,我所有过滤器的优先级都设置为 5000,我猜这个顺序是随机的,有时首先使用 TokenFilter,有时使用 RootFilter。 我的 RootFilter 函数正在停止请求,因为它需要在 TokenFilter 中设置一个属性。

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多