1

是否可以为每个资源定义缓存控制级别?

是否有一些注释可以放在每个 Resource 类之上,以便以自定义方式指定缓存控制?

4

1 回答 1

0

为了解决这个问题,我最终定义了一个@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();
}
于 2012-10-29T16:13:38.997 回答