[YMIR-122] @Inアノテーションによりinjectされたオブジェクトの状態変更は@Out無しでも反映されてほしい。 Created: 2007-09-05 Updated: 2008-08-12 Resolved: 2008-08-12 |
|
Status: | Closed |
Project: | Ymir |
Component/s: | ymir-core |
Affects Version/s: | 0.9.1 |
Fix Version/s: | 0.9.6 |
Type: | Improvement | Priority: | Minor |
Reporter: | Yumeto Yamagishi | Assignee: | skirnir |
Resolution: | Fixed | Votes: | 0 |
Labels: | None | ||
Environment: |
HotDeployは有効な状態 |
Description |
Immutableなオブジェクト以外でもInアノテーションによりinjectされる可能性がある限り、そのオブジェクトに対する状態変更は@Outアノテーションを記述しなくても保持されるべき。 現在の振る舞い: public void _post_valueChange() { _obj.setValue("new Value"); } ... セッションに上記のようなPageクラスのオブジェクトがある場合、アクションValueChangeによって行われたinjectされたオブジェクトそのものに対する変更が、セッション上のオブジェクトには反映されない。 この修正が不可能な場合は、少なくともこの振る舞いをドキュメント化する必要があると思われる。 |
Comments |
Comment by skirnir [ 2008-08-12 ] |
対処しました(r1387)。 具体的には、リクエストを受け取ってからリクエストの処理が終了するまでの間にセッションにsetAttributeされた属性とセッションからgetAttributeされた属性について、リクエストの処理が終了した時点でセッションにsetAttribute()しなおすようにしました(setAttributeされた属性についてもsetAttributeしなおすのは、setAttributeされた後にオブジェクトの状態が変更されうるから)。 |
Comment by skirnir [ 2007-09-10 ] |
おっしゃることは分かりました。 後は実現の方式ですね。@Inに対応する@Outが存在しない場合に@Outがあるかのように振舞うようにするとして、 というわけで、良い方法があればアドバイス下さい。 |
Comment by Yumeto Yamagishi [ 2007-09-07 ] |
アプリケーション間の同期までは求めていませんが、Outjectionされるタイミングで、Injected Objectの状態変更があった場合は、セッションに格納される(シリアライズされる)オブジェクトをリフレッシュ(上書き)する程度のことはやったほうが良いと思われます。 これは、インジェクションされたインスタンス(への参照)は、セッションに保持されているインスタンスそのものであるかのように見せかけるということです。この対応があれば、@Outを記述する目的が以下の2つに絞られるため、コードの記述量が減り、Pageの設計意図が明確になると思います。 逆に、セッションをEIS層と同じ感覚で、InjectionされるオブジェクトはMutableであっても、「シリアライズされているオブジェクトのコピーである」という思想であれば、このIssueはcloseしていただければと思います。 |
Comment by skirnir [ 2007-09-07 ] |
これは、クラスタリングなどの場合にセッションスコープのオブジェクトの変更を別アプリケーションインスタンスに |