ContainerRequestFilter方法未被调用

时间:2015-09-15 14:21:02

标签: java web-services rest jersey tomee

我刚开始学习如何编写REST Web服务代码,而且我已经坚持了好几天了。我使用Jersey 2编写了一个带有基于头的过滤的示例应用程序,并部署在Tomee-plus 1.7.2上。无论我尝试什么,都不会调用ContainerRequestFilter的过滤器方法。

// 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),但过滤器方法是从未打过电话。

我尝试的事情及其影响:

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

  • 在以前的代码中使用 com.sun.jersey.spi.container 前缀代替 org.glassfish.jersey.spi.container :无效。

我老实说这里没有选择。每次我尝试新的东西,要么没有效果,要么一切都停止工作。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

我找到了 ContainerRequestFilter 的替代品,它实际上有效!它是 javax.servlet.Filter 。从这个类开始,我所要做的就是使用以下代码对其进行注释,并且过滤机制就像魅力一样。

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

答案 1 :(得分:0)

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