12

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 を使用しています。

4

3 に答える 3

7

はい、応答オブジェクトを作成した後にEタグを生成できれば、インターセプターを使用してこれを実現できる場合があります。

public class MyInterceptor extends AbstractPhaseInterceptor<Message> {

    public MyInterceptor () {
        super(Phase.MARSHAL);
    }

    public final void handleMessage(Message message) {
        MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);

        if (headers == null) {
            headers = new MetadataMap<String, Object>();
        }             

        //generate E-tag here
        String etag = getEtag();
        // 
        String cc = 600;

        headers.add("E-Tag", etag);
        headers.add("Cache-Control", cc);
        message.put(Message.PROTOCOL_HEADERS, headers);
    }
}

その方法が実行できない場合は、投稿した元のソリューションを使用し、 Person エンティティをビルダーに追加するだけです。

Person p = _dao.getPerson(name);
return builder.entity(p).cacheControl(cc).lastModified(person.getUpdated()).build();
于 2012-08-03T20:05:10.607 に答える