2016-03-07 38 views
2

我已经在一个文件中定义CheckSessionFilter.java的过滤器,像这样:JAX-RS过滤掉不获取调用

@Provider 
@SessionChecker 
public class CheckSessionFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws WebApplicationException { 
     .... 
    } 

在另一个文件中,SessionChecker.java,我有:

@Target({ ElementType.TYPE, ElementType.METHOD }) 
@Retention(value = RetentionPolicy.RUNTIME) 
@NameBinding 
public @interface SessionChecker {} 

我的Web服务在Services.java中定义为:

@Path("Services") 
public class Services { 

    @POST 
    @SessionChecker 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("LogIn") 
    public Response logIn(@Context HttpServletRequest request, Parameters requestParameters) { 
     .... 
    } 
} 

我在WebLogic 12.2.1上部署了我的Web服务。该Web服务正常工作。但是过滤器根本没有被调用。什么可能是错的?

我需要将任何东西放在web.xml中吗?

在此先感谢。

编辑,包括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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    <display-name>XXXXXXXX</display-name> 
    <servlet> 
     <servlet-name>JAX-RS Application</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>rest.application.config.ApplicationConfig</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>JAX-RS Application</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

更新的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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    <display-name>XXXXXXXX</display-name> 
    <servlet> 
     <servlet-name>JAX-RS Application</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>rest.application.config.ApplicationConfig</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>JAX-RS Application</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

编辑以添加应用程序配置:

package rest.application.config; 

import java.util.Set; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.ApplicationPath; 

@ApplicationPath("resources") 
public class ApplicationConfig extends Application { 

    public Set<Class<?>> getClasses() { 
     return getRestClasses(); 
    } 

    //Auto-generated from RESTful web service wizard 
    private Set<Class<?>> getRestClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<Class<?>>(); 
     resources.add(Services.class); 
     return resources;  
    } 
} 
+0

您是否已经在web.xml中定义了前端控制器和url模式? –

+0

我编辑了我的帖子以包含web.xml。正如我原来的帖子中提到的,我的web服务工作正常。只是过滤器没有被调用。你在说什么前端控制器?我已经看过关于过滤器的所有例子,以及关于前端控制器的其他例子。 – user3573403

+0

看起来您正在使用Jersey 1.x(com.sun..ServletContainer),但ContainerRequestFilter是Jersey(Jax-RS)-2.x过滤器。泽西1.x有相同的过滤器,但它是在一个不同的包装,有一个不同的接口合同 –

回答

0

感谢peeskillet,我发现该解决方案将在ApplicationConfig类中添加过滤器,如下面的代码所示。我还需要使用org.glassfish.jersey.servlet.ServletContainer作为web.xml中的servlet容器,用于Jersey 2.x.

package rest.application.config; 

import java.util.Set; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.ApplicationPath; 

@ApplicationPath("resources") 
public class ApplicationConfig extends Application { 

    public Set<Class<?>> getClasses() { 
     return getRestClasses(); 
    } 

    //Auto-generated from RESTful web service wizard 
    private Set<Class<?>> getRestClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<Class<?>>();   
     resources.add(Services.class); 
     resources.add(CheckSessionFilter.class); 
     return resources;  
    } 
}