property-specification の persistent=yes の罠
ページやコンポーネントにプロパティを書いて、「永続化する」と意思表示さえしておけば、セッションに配置してくれるという便利な機能が property-specification ですが、実は永続化するにはセッターを呼ばないといけない という約束があります。つい先日、同僚が相談してきたことから発覚しました。
ま、Tapestry In Action をよく読めば、もしかしたら書いているのかも知れないけど、仕様としてどうだろう?という感がありますねー。property-specification を書いたら、そのクラスのインスタンスが作られた上で宣言されるということを知っているわけだから、普通はセッターを呼ぶ発想には行かないんだけどなぁ。
プロパティの型が string などであれば分からなくもないですが Map や List などのプロパティだと、セッター呼ぶほうが少ないですよね。同僚もそれではまっていました。
結局永続化させるためには、例えば
<property-specification name="items" type="java.util.ArrayList" persistent="yes"/>
などのようにしていても、わざわざ以下のように何かしらのタイミングで(例ではinitialize)永続化させるために、
public abstract ArrayList getItems(); public abstract void setItems(ArrayList items); protected void initialize() { setItems(getItems()); // persist value }
と、書かないといけません。
property-specificationのゲッターではセッションにあればそれを、そうでなければ一時的な変数(pageに置かれるのでこれまたまずい)で返すようにでもしているのでしょう。その時点でセッションに無ければ置いてくれれば良いだけなのになー。私たち以外のTapestrierの皆さんも persistent=yes にしただけで安心しないよう、お気をつけください。コメント
- かとちん(2005/08/25 21:39)
- てかさ、init-value も定義しとくのも吉。