每个资源的Jersey Cache Control

时间:2012-10-29 15:45:23

标签: java jersey jax-rs cache-control restful-architecture

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

我是否可以在每个Resource类的顶部放置一些注释,以便以自定义方式指定缓存控制?

1 个答案:

答案 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();
}