4

我试图拦截在 Glassfish 内运行的 Jersey 中的请求。

我创建了一个实现ContainerRequestFilter

package mycustom.api.rest.security;

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

我的应用程序是使用PackagesResourceConfig.

当 Glassfish 启动时,Jerseys 会找到我的提供者:

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

但它从来没有达到那种filter方法。我错过了什么??

其他一切似乎都运行良好。我添加了几个ContextResolver提供者来进行 JSON 映射,它们工作正常。请求很好地访问了我的资源,它永远不会通过过滤器。

4

1 回答 1

4

我不认为容器过滤器是作为提供者加载的。我认为您必须设置响应过滤器属性。奇怪的是 PackagesResourceConfig 没有 asetProperty()但你可以重载getProperty()and 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;
}

实际上,更仔细地阅读 javadocs,看来首选方法是:

myConfig.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
                              new String [] {"mycustom.rest.security.SecurityProvider"});
于 2013-03-28T17:28:28.237 回答