在我发现的关于 JAX-RS 和缓存的少数几个问题之一(有答案)中,生成 ETag(用于缓存)的答案是在 Response 对象上设置一些值。如下所示:
@GET
@Path("/person/{id}")
public Response getPerson(@PathParam("id") String name, @Context Request request){
Person person = _dao.getPerson(name);
if (person == null) {
return Response.noContent().build();
}
EntityTag eTag = new EntityTag(person.getUUID() + "-" + person.getVersion());
CacheControl cc = new CacheControl();
cc.setMaxAge(600);
ResponseBuilder builder = request.evaluatePreconditions(person.getUpdated(), eTag);
if (builder == null) {
builder = Response.ok(person);
}
return builder.cacheControl(cc).lastModified(person.getUpdated()).build();
}
问题是这对我们不起作用,因为我们对 SOAP 和 REST 服务使用相同的方法,通过使用 @WebMethod (SOAP)、@GET(以及我们可能需要公开服务的任何其他内容)注释这些方法。以前的服务对我们来说是这样的(不包括创建标头):
@WebMethod
@GET
@Path("/person/{id}")
public Person getPerson(@WebParam(name="id") @PathParam("id") String name){
return _dao.getPerson(name);
}
有什么方法 - 通过一些额外的配置 - 设置这些标题?这是我第一次发现使用 Response 对象实际上比仅自动转换有一些好处......
我们正在使用 Apache CXF。