2011-03-17 54 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