これは、Jersey では ResourceFilterFactory を使用して簡単に行うことができます。メソッドにアタッチするカスタム アノテーションを作成して、キャッシュ コントロール設定を設定できます。ResourceFilterFactories は、アプリケーションの初期化時に、検出された各リソース メソッドに対して呼び出されます - ResourceFilterFactory で、メソッドに @CacheControlHeader アノテーション (または呼び出したいもの) があるかどうかを確認できます - そうでない場合は、「no-cache」を追加する応答フィルターを返すだけです" ディレクティブを応答に追加する必要があります。それ以外の場合は、注釈の設定を使用する必要があります。これを行う方法の例を次に示します。
public class CacheFilterFactory implements ResourceFilterFactory {
private static final List<ResourceFilter> NO_CACHE_FILTER = Collections.<ResourceFilter>singletonList(new CacheResponseFilter("no-cache"));
@Override
public List<ResourceFilter> create(AbstractMethod am) {
CacheControlHeader cch = am.getAnnotation(CacheControlHeader.class);
if (cch == null) {
return NO_CACHE_FILTER;
} else {
return Collections.<ResourceFilter>singletonList(new CacheResponseFilter(cch.value()));
}
}
private static class CacheResponseFilter implements ResourceFilter, ContainerResponseFilter {
private final String headerValue;
CacheResponseFilter(String headerValue) {
this.headerValue = headerValue;
}
@Override
public ContainerRequestFilter getRequestFilter() {
return null;
}
@Override
public ContainerResponseFilter getResponseFilter() {
return this;
}
@Override
public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
// attache Cache Control header to each response based on the annotation value
response.getHttpHeaders().putSingle(HttpHeaders.CACHE_CONTROL, headerValue);
return response;
}
}
}
注釈は次のようになります。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CacheControlHeader {
String value();
}
ResourceFilterFactory は、次の init パラメータを web.xml の Jersey サーブレットの定義に追加することで、アプリケーションに登録できます。
<init-param>
<param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
<param-value>package.name.CacheFilterFactory</param-value>
</init-param>