Java 每个资源的缓存控制

Java 每个资源的缓存控制,java,jersey,jax-rs,cache-control,restful-architecture,Java,Jersey,Jax Rs,Cache Control,Restful Architecture,是否可以为每个资源定义缓存控制级别 是否有一些注释可以放在每个资源类的顶部,以便以自定义方式指定缓存控制?为了解决这个问题,我最终定义了一个@cache方面。我遇到了几个警告: 缓存的方法需要返回一个响应对象而不是POJO,以便方面可以修改头 如果您想使用etag,那么包含方法或方法参数本身的类需要公开@Request,以便方面可以检查传入的标记 确保您的方法参数与方法名称相结合,实际上将创建唯一的键。这里的另一个问题是响应类型。客户端可能发出两个参数相同但响应类型不同的请求 您可以轻松地向方面

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


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

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

缓存的方法需要返回一个响应对象而不是POJO,以便方面可以修改头

如果您想使用etag,那么包含方法或方法参数本身的类需要公开@Request,以便方面可以检查传入的标记

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

您可以轻松地向方面添加选项,以控制每个方法的最大年龄和其他参数

以下是我的invoke方法:

@凌驾 公共对象invokeMethodInvoke调用抛出可丢弃的{ 如果Response.class!=invocation.getMethod.getReturnType{ logger.warningString.format%s可@cacable,但不返回响应对象invocation.getMethod; 返回调用。继续; } 可选请求=getRequestinvocation; if!request.isPresent{ logger.warningString.format%s可@cacable,但未声明名为\Request\、invocation.getMethod的公共请求字段; 返回调用。继续; } 对象响应=super.invokeinvocation; EntityTag responseTag=JaxRsUtil.getEntityTagresponse; Response.ResponseBuilder builder=request.get.evaluatePreconditionsresponseTag; 如果为null!=builder{ logger.finer找到匹配的etag:+responseTag; 返回builder.build; } CacheControl cc=新的CacheControl; cc.setmaxageaxage; builder=Response.fromResponseResponseresponse.tagresponseTag.cacheControlcc; 返回builder.build; }
如果你能使用Jersey 2.0:这看起来很酷。您确定它只适用于2.0吗?不太确定,但本文将介绍新功能,特别是新的过滤器API。不过我还没试过。看起来需要做很多工作:我会看看这是否是我们想要做的。非常感谢使用ContainerResponseFilter有一种更简单、非AOP的方法:。