是否有可能为每个资源定义缓存控制级别?
我是否可以在每个Resource类的顶部放置一些注释,以便以自定义方式指定缓存控制?
答案 0 :(得分:0)
为了解决这个问题,我最终定义了@Cache
方面。我遇到了几个警告:
缓存方法需要返回Response
对象(不是POJO),以便方面可以修改标题。
如果要使用ETag,则包含该方法的类(或方法参数本身)需要公开@Request
,以便方面可以检查传入的标记。
确保您的方法参数与您的方法名称相结合,实际上会创建唯一键。另一个问题是响应类型。客户端可以发出两个参数相同但响应类型不同的请求。
您可以轻松地向方面添加选项,以便在每个方法的基础上控制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();
}