【问题标题】:ContainerRequestFilter method not being calledContainerRequestFilter 方法未被调用
【发布时间】:2015-09-15 14:21:02
【问题描述】:

我刚刚开始学习如何编写 REST Web 服务,而且我已经被这个问题困扰了好几天了。我正在编写一个基于标头过滤的示例应用程序,使用 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 文件是空的,保存所需的标题。现在的行为是:过滤器被识别为@Provider并正常实例化,我拥有的测试Web服务(只是一个返回空响应的GET)可以正常调用,但是 filter 方法是从来没有打电话。

我尝试过的事情及其效果:

  • 在扩展应用程序的类中声明过滤器:部署时出错。
  • 在扩展 ResourceConfig 的类中注册过滤器:过滤器被实例化了两次,但仍然没有调用 filter 方法。
  • 使用 com.sun.jersey.spi.container 包中的类:无效。
  • 向 WS 方法添加身份验证注释(@RolesAllowed、@PermitAll、...):无效。
  • 在服务器配置中将 disabled=true 添加到 cfx-rs.properties:在通常的 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:无效。

老实说,我在这里没有选择余地。每次我尝试新事物时,要么没有效果,要么一切都停止工作。有什么帮助吗?

【问题讨论】:

  • 您是否为配置 TomEE 以使用 Jersey 做了什么特别的事情?它已经有一个 CXF 实现。你能找到任何迹象表明泽西岛实际上正在被使用,而不是 CXF 吗?如果正在使用 CXF,AFAIK,该版本的 TomEE 使用仅与 JAX-RS 1.1 而不是 2.0 兼容的 CXF 版本。 2.0 是带有ContainerRequestFilter 的版本。
  • 我唯一尝试的是我所说的,我在 cfx-rs.properties 配置文件中添加了一个 disabled=true。我想这就像你说的那样,禁用 Tomee CXF 实现,但是当我这样做时,我无法再通过我能想到的任何 URL 访问 Web 服务。

标签: java web-services rest jersey apache-tomee


【解决方案1】:

我找到了 ContainerRequestFilter 的替代方法,它确实有效!它是 javax.servlet.Filter。从这个类扩展,我所要做的就是用下面的代码注释它,过滤机制就像一个魅力。

@WebFilter(filterName = "AuthenticationFilter", urlPatterns = { "/*" })

【讨论】:

    【解决方案2】:

    原因是ContainerRequestFilter 是 JAX-RS 2.0 的一部分,但 TomEE 1.7.X 是 JAX-RS 1.1 的一部分。您要么必须将 TomEE 升级到 7.0.0+,要么使用不同的服务器(例如 Glassfish)。

    【讨论】:

    • 已经很久了,我已经转移到普通的 Tomcat,但感谢您的洞察力 ;)
    猜你喜欢
    • 2014-07-03
    • 2014-03-04
    • 2020-02-25
    • 2012-10-16
    • 2021-08-12
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多