各リソースのキャッシュ制御レベルを定義することはどういうわけか可能ですか?
カスタムの方法でキャッシュ制御を指定するために、各Resourceクラスの上に配置できる注釈はありますか?
各リソースのキャッシュ制御レベルを定義することはどういうわけか可能ですか?
カスタムの方法でキャッシュ制御を指定するために、各Resourceクラスの上に配置できる注釈はありますか?
この問題を解決するために、私は@Cache
アスペクトを定義することになりました。私が遭遇したいくつかの警告があります:
Response
キャッシュされたメソッドは、アスペクトがヘッダーを変更できるように、オブジェクト(POJOではない)を返す必要があります。
ETagを使用する場合は、メソッド(またはメソッド引数自体)を含むクラスが公開する必要があります。@Request
これにより、アスペクトは着信タグを検査できます。
メソッド引数をメソッド名と組み合わせて、実際に一意のキーを作成することを確認してください。ここでのもう1つの問題は、応答タイプです。クライアントは、パラメーターは同じで応答タイプが異なる2つの要求を発行する場合があります。
max-age
メソッドごとに制御するオプションやその他のパラメーターをアスペクトに簡単に追加できます。
これが私のinvoke
方法です:
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
if (Response.class != invocation.getMethod().getReturnType()) {
logger.warning(String.format("%s is @Cachable but does not return a Response object", invocation.getMethod()));
return invocation.proceed();
}
Optional<Request> request = getRequest(invocation);
if (!request.isPresent()) {
logger.warning(String.format("%s is @Cachable but does not declare a public Request field named \"request\"", invocation.getMethod()));
return invocation.proceed();
}
Object response = super.invoke(invocation);
EntityTag responseTag = JaxRsUtil.getEntityTag(response);
Response.ResponseBuilder builder = request.get().evaluatePreconditions(responseTag);
if (null != builder) {
logger.finer("Found matching etag: " + responseTag);
return builder.build();
}
CacheControl cc = new CacheControl();
cc.setMaxAge(maxAge);
builder = Response.fromResponse((Response)response).tag(responseTag).cacheControl(cc);
return builder.build();
}