是否可以为每个资源定义缓存控制级别?
是否有一些注释可以放在每个 Resource 类之上,以便以自定义方式指定缓存控制?
是否可以为每个资源定义缓存控制级别?
是否有一些注释可以放在每个 Resource 类之上,以便以自定义方式指定缓存控制?
为了解决这个问题,我最终定义了一个@Cache
方面。我遇到了一些警告:
缓存的方法需要返回一个Response
对象(不是 POJO),以便方面可以修改标头。
如果你想使用 ETags,那么包含方法的类(或方法参数本身)需要公开,@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();
}