未调用 ContainerRequestFilter 方法
ContainerRequestFilter method not being called
我刚刚开始学习如何编写 REST Web 服务代码,现在我已经坚持了好几天。我正在编写一个带有 header-based 过滤的示例应用程序,使用 Jersey 2 并部署在 Tomee-plus 1.7.2 上。无论我尝试什么,ContainerRequestFilter 的 filter 方法都不会被调用。
// TestRequestFilter.java
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.ext.Provider;
@Provider
@PreMatching
public class TestRequestFilter implements ContainerRequestFilter
{
private final static Logger log = Logger.getLogger(DemoRESTRequestFilter.class.getName());
@Override
public void filter(ContainerRequestContext requestCtx) throws IOException
{
System.out.println("FILTER-REQUEST");
}
}
我的 web.xml 文件是空的,保存了所需的 headers。现在的行为是:过滤器被识别为 @Provider 并正常实例化,我拥有的测试 Web 服务(只是一个返回空响应的 GET)可以正常调用,但是 filter 方法从未被调用。
我尝试过的事情及其效果:
- 在 class 扩展应用程序中声明过滤器:部署时出错。
- 在 class 扩展 ResourceConfig 中注册过滤器:过滤器被实例化两次,但 filter 方法仍未被调用。
- 使用 com.sun.jersey.spi.container 包中的 classes:无效。
- 向 WS 方法添加身份验证注释(@RolesAllowed、@PermitAll、...):无效。
- 在服务器配置cfx-rs.properties中添加disabled=true:部署的服务在正常情况下找不到URL.
- 将此添加到 web.xml:无效。
<servlet>
<servlet-name>CongressAppWS</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>org.glassfish.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.s4w.congressapp.auth.DemoRESTRequestFilter;com.s4w.congressapp.auth.DemoRESTResponseFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.s4w.congressapp.auth;com.s4w.congressapp.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 在之前的代码中使用com.sun.jersey.spi.container前缀代替org.glassfish.jersey.spi.container:无效。
老实说,我 运行 别无选择。每次我尝试新事物时,要么没有效果,要么一切都停止了。有帮助吗?
我找到了 ContainerRequestFilter 的替代品,它确实有效!是 javax.servlet.Filter。从此 class 扩展,我所要做的就是用以下代码对其进行注释,过滤机制就像一个魅力。
@WebFilter(filterName = "AuthenticationFilter", urlPatterns = { "/*" })
原因是 ContainerRequestFilter
是 JAX-RS 2.0 的一部分,而 TomEE 1.7.X 是 JAX-RS 1.1 的一部分。您要么必须将 TomEE 升级到 7.0.0+,要么使用不同的服务器(例如 Glassfish)。
我刚刚开始学习如何编写 REST Web 服务代码,现在我已经坚持了好几天。我正在编写一个带有 header-based 过滤的示例应用程序,使用 Jersey 2 并部署在 Tomee-plus 1.7.2 上。无论我尝试什么,ContainerRequestFilter 的 filter 方法都不会被调用。
// TestRequestFilter.java
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.ext.Provider;
@Provider
@PreMatching
public class TestRequestFilter implements ContainerRequestFilter
{
private final static Logger log = Logger.getLogger(DemoRESTRequestFilter.class.getName());
@Override
public void filter(ContainerRequestContext requestCtx) throws IOException
{
System.out.println("FILTER-REQUEST");
}
}
我的 web.xml 文件是空的,保存了所需的 headers。现在的行为是:过滤器被识别为 @Provider 并正常实例化,我拥有的测试 Web 服务(只是一个返回空响应的 GET)可以正常调用,但是 filter 方法从未被调用。
我尝试过的事情及其效果:
- 在 class 扩展应用程序中声明过滤器:部署时出错。
- 在 class 扩展 ResourceConfig 中注册过滤器:过滤器被实例化两次,但 filter 方法仍未被调用。
- 使用 com.sun.jersey.spi.container 包中的 classes:无效。
- 向 WS 方法添加身份验证注释(@RolesAllowed、@PermitAll、...):无效。
- 在服务器配置cfx-rs.properties中添加disabled=true:部署的服务在正常情况下找不到URL.
- 将此添加到 web.xml:无效。
<servlet>
<servlet-name>CongressAppWS</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>org.glassfish.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.s4w.congressapp.auth.DemoRESTRequestFilter;com.s4w.congressapp.auth.DemoRESTResponseFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.s4w.congressapp.auth;com.s4w.congressapp.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 在之前的代码中使用com.sun.jersey.spi.container前缀代替org.glassfish.jersey.spi.container:无效。
老实说,我 运行 别无选择。每次我尝试新事物时,要么没有效果,要么一切都停止了。有帮助吗?
我找到了 ContainerRequestFilter 的替代品,它确实有效!是 javax.servlet.Filter。从此 class 扩展,我所要做的就是用以下代码对其进行注释,过滤机制就像一个魅力。
@WebFilter(filterName = "AuthenticationFilter", urlPatterns = { "/*" })
原因是 ContainerRequestFilter
是 JAX-RS 2.0 的一部分,而 TomEE 1.7.X 是 JAX-RS 1.1 的一部分。您要么必须将 TomEE 升级到 7.0.0+,要么使用不同的服务器(例如 Glassfish)。