[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 class HogePage {
@In(scopeClass=SessionScope.class)
public void setMutableObject(MutableObject obj)

{ _obj = obj; }

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があるかのように振舞うようにするとして、
それを「常に」そうして良いのか(Injected Objectへの変更をフレームワークが検知できないため、「変更があった場
合のみ」ということができないので)、「全てのScopeについて」そうして良いのか悩んでいます。おそらくSessionScope
の場合は「常に」上記の振る舞いで良いと思いますが、そういう振る舞いをしない方がよいScopeもあるかと思います
(例:RedirectionScope)。

というわけで、良い方法があればアドバイス下さい。

Comment by Yumeto Yamagishi [ 2007-09-07 ]

アプリケーション間の同期までは求めていませんが、Outjectionされるタイミングで、Injected Objectの状態変更があった場合は、セッションに格納される(シリアライズされる)オブジェクトをリフレッシュ(上書き)する程度のことはやったほうが良いと思われます。

これは、インジェクションされたインスタンス(への参照)は、セッションに保持されているインスタンスそのものであるかのように見せかけるということです。この対応があれば、@Outを記述する目的が以下の2つに絞られるため、コードの記述量が減り、Pageの設計意図が明確になると思います。
 ・新たにオブジェクトを(セッションなどに)格納する場合
 ・格納されているオブジェクトを削除する場合

逆に、セッションをEIS層と同じ感覚で、InjectionされるオブジェクトはMutableであっても、「シリアライズされているオブジェクトのコピーである」という思想であれば、このIssueはcloseしていただければと思います。

Comment by skirnir [ 2007-09-07 ]

これは、クラスタリングなどの場合にセッションスコープのオブジェクトの変更を別アプリケーションインスタンスに
通知できないということを指していますか?もしそうならおっしゃるとおりです。ただ、現状のYmirはクラスタリングを
想定した作りになっていないため、この対応をしてもクラスタリング環境では動作しません。(将来的にはクラスタリ
ング環境でも動作するようにしたいと思っていますが)

Generated at Wed Apr 09 03:32:42 JST 2025 using Jira 10.5.0#10050000-sha1:9d9d098bb7b67e8dba8da380ba9c3900d82ac3cf.