gpt4 book ai didi

java - 每个资源的 Jersey 缓存控制

转载 作者:行者123 更新时间:2023-12-01 05:03:07 25 4
gpt4 key购买 nike

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

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

最佳答案

为了解决这个问题,我最终定义了一个 @Cache 方面。我遇到了一些警告:

  • 缓存的方法需要返回一个Response对象(不是POJO),以便方面可以修改 header 。

  • 如果您想使用 ETag,则包含该方法的类(或方法参数本身)需要公开 @Request,以便方面可以检查传入的标记。

  • 确保您的方法参数与方法名称相结合实际上会创建唯一的键。这里的另一个问题是响应类型。客户端可能会发出两个参数相同但响应类型不同的请求。

  • 您可以轻松地向方面添加选项,以按方法控制 max-age 和其他参数。

这是我的调用方法:

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

关于java - 每个资源的 Jersey 缓存控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com