JAX-RS とキャッシングに関して SO で見つけたいくつかの質問 (回答付き) の 1 つで、(キャッシング用の) 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 を使用しています。