如何在Jersey过滤器

时间:2015-04-30 13:09:57

标签: java jersey

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

@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。这就是我确定优先级的原因,我试图以两种方式设置值优先级,但没有任何工作。

我试图在类和@ToRootFilter上放置@ToTokenFilter,但问题仍然存在。

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

修改

这是web.xml

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

1 个答案:

答案 0 :(得分:1)

我终于找到了问题:

我正在导入:

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

而不是

import javax.annotation.Priority;

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

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