2013-03-28 44 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

相关问题