2012-01-26 5 views
1

Representation/Repre sentationInfoでETAGおよびLastModifiedプロパティを設定できることはわかっています。 しかし、私は単純なリソースは次のように実装しました:ServerResourceから送信された表現上でETAG/LastModifiedを設定する

public class AccountServerResource extends ServerResource implements AccountResource { 

    private static Logger log = Logger.getLogger(Acc​ountServerResource.c​lass.getName()); 

    @Override 
    public Account retrieve() { 
     User user = getClientInfo().getUser(); 
     AccountDAO dao = new AccountDAO(); 
     Account ret = dao.getAccountByEmai​l(user.getEm​ail()); 
     log.info("retrieved " + ret); 
     // getResponse().getEntity() == null at this point !!! 
     // ---> cannot do this : getResponse().getEntity().setModificationDate(ret.getLastMod​ified()); 
     return ret; 
    } 
} 

を表現はまだこの時点での応答に添付されていません。 いつETAG/LastModifiedタグを設定しますか?

ここで推奨される方法は何ですか?

私は運がなく、このアプローチを試みた --- --- UPDATE

:このような

@Override 
public Account retrieve() { 
     User user = getClientInfo().getUser(); 
    AccountDAO dao = new AccountDAO(user.getN​amespace()); 
     AccountDAO dao = new AccountDAO(); 
     Account ret = dao.getAccountByEmai​l(user.getEm​ail()); 
    log.info("retrieved " + ret); 
    setOnSent(new StrongEtagCallback​<Account>(ret));​ 
    return ret; 
} 

をそしてStrongEtagCallbackの実装:

public class StrongEtagCallback<T extends DomainResource> implements Uniform { 

    private static SimpleDateFormat df = new SimpleDateFormat("dd​MMyyyyHHmmssSSS"); 
    private DomainResource d; 

    public StrongEtagCallback(T domainResource) { 
     d = domainResource; 
    } 

    @Override 
    public void handle(Request request, Response response) { 
     String eTag = d.getClass().getSimpleName() + "-" + d.getId() + "-" + df.format(d.getLastModified()); 
     response.getEntity().setTag(new Tag(eTag, false)); 
    } 
} 

すべての私のエンティティをそれらがIDとLastModified日付を持つことを要求するDomainResourceを実装します。

しかし、動作しません。私は本当にこれがうまくいくと思っていました、それはとてもエレガントです!

StrongEtagCallbackが呼び出されていますが、ETAGはエンティティのサーバー側を設定しています。私のWiresharkと私のGWTクライアントは、応答の応答にE-TAGヘッダーを見ます。ダイビングは今より深い。

答えて

2

この問題を自分自身で調べてみたところ、Restartディスカッション掲示板でkomaによって開始されたparallel threadに気付きました。これには、Tim PeierlsがResource.toRepresentation()をオーバーライドする別の方法がありました。

komaがそのスレッドで指摘しているように、ServerResource.handle()をオーバーライドすると条件が一致しなくなりました(なぜわかりませんか?)ので、そのアプローチは問題になります。ティム・パイエルスによって提供さ

例・オーバーライド・コード:

@Override public Representation toRepresentation(Object source, Variant target) { 
    Representation rep = super.toRepresentation(source, target); 
    if (source instanceof HasLastModified) { 
     HasLastModified hlm = (HasLastModified) source; 
     rep.setModificationDate(hlm.getLastModified()); 
    } 
    if (source instanceof HasEtag) { 
     HasEtag he = (HasEtag) source; 
     rep.setTag(he.gettag()); 
    } 
    return rep; 
} 
+0

あなたが正しいですうん、私の答えは時代遅れです。 – koma

1

最後の解決策は、リターンドメインエンティティをローカル変数にし、ServerResourceのhandle()メソッドをオーバーライドすることでした。

はServerResourceの1つのインスタンスが同時に複数のスレッドによってアクセス各扱わコールと ため

を作成しているので、実装はこのように書き:

javadocはと述べているので、これは安全です
private Account ret = null; 

@Override 
public Account retrieve() { 
    User user = getClientInfo().getUser(); 
    AccountDAO dao = new AccountDAO(); 
    ret = dao.getAccountByEmail(UserServiceFactory.getUserService().getCurrentUser().getEmail()); 
    // getResponse().getEntity().setModificationDate(ret.getLastModified()); 
    // lastModified = ret.getLastModified(); 
    log.info("retrieved " + ret); 
    //setOnSent(new StrongEtagCallback<Account>(ret)); 
    return ret; 
} 

@Override 
public Representation handle() { 
    Representation representation = super.handle(); 
    if (ret != null) { 
     new StrongEtagCallback<Account>(ret).handle(getRequest(), getResponse()); 
    } 
    return representation; 
} 

はETagヘッダは、現在送信されている:

HTTP/1.1 200 OK 
Content-Type: application/x-java-serialized-object+gwt; charset=UTF-8 
ETag: "Account-104-27012012003721199" 
Date: Thu, 26 Jan 2012 23:44:32 GMT 
Accept-Ranges: bytes 
Server: Restlet-Framework/2.1rc1 
Transfer-Encoding: chunked 

PS:応答がコミットされた後にコールバックsetOnSentを設定する私の最初の解決策が出されたので、この解決策は機能しませんでした。私は実際には同じようなフックか何かを期待しますsetNext() Restletは後処理を行います。結局のところ、コールバックはUniformインターフェイスを実装しています。 IMOでは、これはRestletの全体的なアーキテクチャに適しています。

関連する問題