2013-04-30 86 views
1

我使用的是Jersey 1.17和Jersey-Spring 1.8。Jersey資源過濾器和彈簧

我想讓球衣ResourceFilter正確安裝。我希望這個過濾器在應用程序範圍內。

我已經在spring中定義了ResourceFilter實現(在XML中定義),並用@Provider註解對它進行了註釋。

@Provider 
public class ContainerResourceFilterTest implements ResourceFilter 
{ 
    public ContainerRequestFilter getRequestFilter() 
    { 
     return null; //TODO 
    } 

    public ContainerResponseFilter getResponseFilter() 
    { 
     return null; //TODO 
    } 
} 

但是,當我在發送一個請求不被打到。

如果我使用@ResourceFilters註釋上的特定資源,那麼它將按預期工作,但我並不想這樣做,在每一個班上。

如何註冊應用程序範圍的過濾器?

回答

0

回答我自己的問題。

進一步閱讀球衣源代碼我發現@Provider註釋不會爲ResourceFilterFactoryContainerRequest/Response做任何事情。這些只能在下列2種方式

  • 使用META-INF /服務
  • 使用servlet的初始化參數之一來登記,例如在web.xml

    <init-param> 
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name> 
        <param-value>com.my.path.ResourceFilterFactory</param-value> 
    </init-param> 
    

不確定爲什麼代碼不檢查實現相應接口的@Providers的註冊彈簧bean。

值得注意的是,註冊實現ResourceFilter的類不適用於上述任何一種方法。您必須爲ResourceFilterFactory執行此操作,並返回ResourceFilter實現。

好消息是,一旦你已經讓球衣知道需要註冊它調用到春天提供這些類自動佈線等工程按慣例。

0

澤西不會掃描類路徑的所有內容 - ResourceFilters是它不會自動找到的東西之一。如果您使用的是ResourceConfig類,註冊您的ResourceFilter類:然後

@ApplicationPath("/myapp") 
public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     packages(getClass().getPackage().toString()); 
     register(ContainerResourceFilterTest.class); 
    } 
} 

澤西將掃描該類的過濾器接口,創建一個實例(所有過濾器是根據自己的文檔單範圍),並將其插入到澤西島過濾器鏈。