2011-03-17 116 views
5

我创建了一个RestEASY拦截器,允许我在web服务调用完成后在HTTP响应中设置标题值。我的代码看起来像这样...RestEASY拦截器不被称为

@Provider 
@ServerInterceptor 
@Precedence("HEADER_DECORATORS") 
public class MyHeaderInterceptor implements 
     MessageBodyWriterInterceptor { 

    @Override 
    public void write(MessageBodyWriterContext context) throws IOException, 
      WebApplicationException { 

      ....do stuff here.... 
     } 
} 

但是,当我拨打我的服务时,拦截器从不会被调用。我看到web服务调用成功完成,但是拦截器中的代码都没有执行过。除此之外,我还需要做什么才能注册拦截器?它是否必须在其他地方声明?是否需要包含任何特殊的web.xml参数?

回答

8

您必须在您的web.xml的resteasy.providers上下文参数中列出拦截器。向Interceptor类添加注释是不够的。

<context-param> 
     <param-name>resteasy.providers</param-name> 
     <param-value>org.resteasy.test.ejb.exception.FooExceptionMapper</param-value> 
</context-param> 
1

至于RestEasy的2.x的,你也可以拥有它自动扫描WEB-INF两个@Provider和JAX-RS资源类/ lib目录罐子和WEB-INF/classes目录(@Path,@GET ,@POST等)并进行注册:

<context-param> 
    <param-name>resteasy.scan</param-name> 
    <param-value>true</param-value> 
</context-param> 

,或者可以具有RestEasy的来扫描@Provider类和注册它们:

<context-param> 
    <param-name>resteasy.scan.providers</param-name> 
    <param-value>true</param-value> 
</context-param> 

在你没有这两种情况下必须明确列出的拦截器到web.xml中。否则,如果没有启用context-params'resteasy.scan'和'resteasy.scan.providers'(并且默认禁用它们),则可能需要指定逗号分隔的完全限定的@Provider类名称列表要在 'resteasy.providers' 元素中注册:

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.test.Interceptor1,com.test.Interceptor2</param-value> 
</context-param> 

这是从DOC采取:http://docs.jboss.org/resteasy/docs/2.3.3.Final/userguide/html_single/index.html#d0e72