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 が起動すると、Jersey は私のプロバイダーを見つけます。

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

しかし、その方法には決して当たらないfilter。私は何が欠けていますか??

他のすべては正常に機能しているようです。ContextResolverJSON マッピングを行うためにいくつかのプロバイダーを追加しましたが、それらは正常に動作します。リクエストは私のリソースにうまくヒットしますが、フィルターを通過することはありません。

4

1 に答える 1

4

コンテナー フィルターがプロバイダーとして読み込まれるとは思いません。応答フィルター プロパティを設定する必要があると思います。奇妙なことに、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;
}

実際、javadocs をより詳しく読むと、推奨される方法は次のようになります。

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