Jersey 未触发任何ContainerRequestFilter

Jersey 未触发任何ContainerRequestFilter,jersey,jersey-2.0,Jersey,Jersey 2.0,我正在尝试使用ContainerRequestFilter在基于Tomcat的应用程序上实施一些身份验证。我跟着。 问题:过滤器从未触发 过滤器类: @Provider public class AuthFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException

我正在尝试使用
ContainerRequestFilter
在基于Tomcat的应用程序上实施一些身份验证。我跟着。 问题:过滤器从未触发

过滤器类:

@Provider
public class AuthFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
        throws IOException {

        // MY AUTHENTICATION CODE GOES HERE

    }
web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="debate-rest"
    version="3.0">
  <display-name>rest</display-name>
   <servlet>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>  
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.hck.debate.rest.security.AuthFilter</param-value>
    </init-param>
    <init-param>  
      <param-name>jersey.config.server.provider.packages</param-name>  
      <param-value>com.hck.debate.rest.controller</param-value>  
    </init-param>  
    <init-param>  
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>  
        <param-value>true</param-value>  
    </init-param>      
    <load-on-startup>1</load-on-startup>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <url-pattern>/*</url-pattern>  
  </servlet-mapping>

休息
泽西岛休息服务
org.glassfish.jersey.servlet.ServletContainer
com.sun.jersey.spi.container.ContainerRequestFilters
com.hck.discussion.rest.security.AuthFilter
jersey.config.server.provider.packages
com.hck.discussion.rest.controller
com.sun.jersey.api.json.POJOMappingFeature
真的
1.
泽西岛休息服务
/*  

好的,我不知道
jersey.config.server.provider.packages
init参数不仅需要引用服务类(API端点),还需要引用包括过滤器在内的所有类

现在它可以工作了:

<init-param>  
  <param-name>jersey.config.server.provider.packages</param-name>  
  <param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security</param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>

jersey.config.server.provider.packages
com.hck.discussion.rest.controller;com.hck.discussion.rest.security
com.sun.jersey.spi.container.ContainerRequestFilters
com.hck.discussion.rest.security.AuthFilter

我还必须将@ProviderJAX-RS注释添加到我的过滤器中。
这使得过滤器在JAX-RS扫描阶段可以被发现

@Provider
public class MyAppFilter implements ContainerRequestFilter {
    // filter logic
}

与球衣一起使用过滤器的最低要求:

  • 将@Provider注释添加到筛选器类
  • 筛选器类的命名空间必须包含在'jersey.config.server.provider.packages'init param中

不需要任何其他设置(例如“com.sun.jersey.spi.container.ContainerRequestFilters”init param或ResourceConfig)

对于JAX-RS 2,jersey和下面的注释,我也遇到了同样的问题

 @PreMatching
一些提示:

  • 确保您使用的是JAX-RS版本2.17
  • 确保在过滤器中使用正确的导入:

    • import javax.ws.rs.container.ContainerRequestContext
    • 导入javax.ws.rs.container.ContainerRequestFilter
  • 添加
    @Provider
    注释


  • 您可以使用
    JerseyServletFactory
    手动注册
    ContainerRequestFilter
    ,而不是使用
    @Provider
    注释(在我的情况下,该注释不起作用):

    JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config);
    HttpServlet myServiceServlet = jerseyServletFactory.create(myResource);
    
    // Register your ContainerRequestFilter like this
    jerseyServletFactory.addRequestFilter(new MyFilter());
    
    httpServer.register(myServiceServlet, "/api");
    httpServer.start();
    

    我没有使用javax.ws.rs,而是使用com.sun.jersey

    import com.sun.jersey.spi.container.ContainerRequestFilter
    导入com.sun.jersey.spi.container.ContainerRequest

    Dropwizard用户需要这样做

    environment.jersey().getResourceConfig()
               .getContainerRequestFilters()
               .add(filter);
    

    如果您像我一样陷入困境,请注意,TomEE 1.7.X使用JAX-RS 1.1,其中不包括ContainerRequestFilter。

    适用于MULE ESB中存在此问题的任何人。 请记住将路径注册到:

    <jersey:resources doc:name="REST">
       <component doc:name="rest component">
         <spring-object bean="endpoit"/>
       </component>
       <jersey:package packageName="path @Provider-s"/>
    </jersey:resources >
    

    我们在ResourceConfig实现类中缺少以下调用:

    register(CorrelationIdFilter.class);
    

    您上面的代码与TomCat一样工作,可能与Glas FISH不同默认行为是递归扫描,因此,您也可以只使用单基包
    com.hck.discome.rest
    还要注意
    com.sun.jersey.spi.container.ContainerRequestFilters
    com.sun.jersey.api.json.POJOMappingFeature
    是无用的。这些是Jersey 1.x属性。它们对Jersey 2.xAlso没有影响。请注意,默认情况下,包扫描是递归的。因此,与其列出多个包,不如声明一个基本包,如
    com.hck.discome.rest
    ,它将递归地扫描所有子包。仅供参考,扫描的目的是提取带有
    @Provider
    @Path
    注释的类,因此,您需要确保也有
    @Provider
    注释。这里没有注释也没有发生任何事情“@Provider”真的有必要吗?是的,我只需要添加@Provider注释。包扫描已经正确设置,这段代码应该放在哪里?@jon在初始化过程中。我将代码放在
    JettyHttpServer
    的创建和启动之间,其他需要在启动时初始化的东西(数据源、资源、DAO等)我也这样做了,现在我想调用servlet的destroy(对于一些自定义清理任务)。我无法获取此筛选器的引用以在关机事件中调用destroy。是否确实需要“@Provider”?是的,它将组件注释为某个提供程序。它用于扩展基本JAX-RS功能。它真的需要“@Provider”吗?是的。Jersey将仅从指定的名称空间加载标记的类,但这会更改语义!添加此方法仅影响调用筛选器的时间。我严重怀疑这会改变任何东西的配置!谢谢,这正是我所需要的。从而创建了依赖于您不应该依赖的包的代码。