2013-03-28 48 views
3

我正試圖攔截在Glassfish內部運行的Jersey中的請求。在沒有web.xml的情況下在Jersey中使用ContainerRequestFilter

我創建ContainerRequestFilter

package mycustom.api.rest.security; 

@Provider 
public class SecurityProvider implements ContainerRequestFilter { 
    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
    return request; 
    } 
} 

我的應用程序的實現使用的PackagesResourceConfig子類開始。

當Glassfish的開始,球衣找到我的供應商:

INFO: Provider classes found: 
    class mycustom.rest.security.SecurityProvider 

但它從來沒有碰到那filter方法。我在想什麼?

其他一切似乎都工作正常。我添加了幾個ContextResolver提供程序來執行JSON映射,它們工作正常。請求打我的資源很好,它從來沒有通過過濾器。

回答

3

我不認爲容器過濾器作爲提供者加載。我認爲你必須設置響應過濾器屬性。奇怪的是PackagesResourceConfig沒有setProperty(),但你可以重載getProperty()getProperties()

public Object getProperty(String propertyName) { 
    if(propertyName.equals(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS)) { 
    return new String[] {"mycustom.rest.security.SecurityProvider"}; 
    } else { 
    return super.getProperty(propertyName); 
    } 
} 

public Map<String,Object> getProperties() { 
    propName = ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS; 
    Map<String,Object> result = super.getProperties(); 
    result.put(propName,getProperty(propName)); 
    return result; 
} 

事實上,閱讀的javadoc更加緊密,它出現的首選方法是:

myConfig.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, 
           new String [] {"mycustom.rest.security.SecurityProvider"}); 
+0

感謝您的答覆。我實際上已經嘗試過了,還有'getContainerRequestFilters()'。都不會被調用。 – mprivat

+0

好吧,讓它工作。覆蓋的方法(至少在我的情況下)是'public Map getProperties()'。 +1和接受爲正確的軌道。 – mprivat

+0

我想完整性你不得不這樣做。我仍然覺得很奇怪,他們至少沒有創建一個受保護的setProperty方法。感謝更新。我會在答案中包括這一點。 – Pace

相關問題