En one of the few questions (with answers) he encontrado en SO con respecto a JAX-RS y el almacenamiento en caché, la respuesta a la generación de ETags (para el almacenamiento en caché) es mediante la configuración de algunos valores en el objeto de respuesta. Como en el siguiente:¿Es posible establecer ETags usando JAX-RS sin recurrir a objetos de respuesta?
@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();
}
El problema es que no va a funcionar para nosotros, ya que utilizamos los mismos métodos para SOAP y REST servicios, anotando los métodos con @WebMethod (SOAP), @GET (y cualquier otra cosa que necesitemos para exponer el servicio). El servicio anterior se parecería a esto a nosotros (con exclusión de la creación de cabeceras):
@WebMethod
@GET
@Path("/person/{id}")
public Person getPerson(@WebParam(name="id") @PathParam("id") String name){
return _dao.getPerson(name);
}
¿Hay alguna manera - a través de alguna configuración adicional - de establecer esas cabeceras? Esta es la primera vez que encuentro que el uso de objetos Response en realidad tiene algún beneficio sobre la auto conversión ...
Estamos usando Apache CXF.
¿Podría posiblemente usar algún tipo de Interceptor? http://stackoverflow.com/questions/3165647/apache-cxf-how-to-add-custom-http-header-to-jax-rs-response?rq=1 – oligofren