[Seasar-user:13147] Re: [S2Container] ConversionRuleを定義したDxoが動かなくなりました.
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2008年 3月 4日 (火) 17:00:23 JST
小林 (koichik) です.
Date: Tue, 04 Mar 2008 12:42:36 +0900
From: "Applied_MATSUDA Masaaki" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:13146] [S2Container] ConversionRuleを定義したDxoが動かなくなりました.
> Dxoのコードはこんなふうです.
>
> @ConversionRule("testEntityHead.productCode : productCode,
> testEntityHead.status : status")
そもそも,こういう指定は S2Dxo でサポートしていません.
以下,ドキュメントからの抜粋です.
# 2.4.17 以前からほとんど変わっていません.
http://s2container.seasar.org/2.4/ja/s2dxo.html#propertyName
----------------------------------------------------------------------
変換ルールは文字列で,その内容は
destPropertyName : sourcePropertyName
という組をカンマ区切りで並べたものです.変換先のプロパティ名が
前になるので注意してください.
変換元のプロパティ名には,ネストしたJavaBeansのプロパティ名を
ピリオド区切りで指定することもできます.
ename : name, dname : department.name
----------------------------------------------------------------------
変換元,つまり : の後ろ側にはネストしたプロパティ名を
指定できますが,変換先,つまり : の前側にはネストした
プロパティを記述することはできないのです.
2.4.18 以降で例外がスローされるようになったのは,
簡易指定の実装が変わったせいです.
2.4.17 以前では,変換ルールの先頭が ' で始まって
いなければ簡易指定と解釈し,変換元を ' で囲むという
処理が行われていました.
そのため,問題の変換ルールは
@ConversionRule("'testEntityHead.productCode' : productCode,
'testEntityHead.status' : status")
と指定した場合と等価でした.
内部的には,
#{ 'testEntityHead.productCode' : productCode,
'testEntityHead.status' : status }
という OGNL のMap リテラルとして扱われます.
2.4.18 からはヌルポ対策のため,簡易指定は
上記のような OGNL 式に変換するのではなく,
独自に処理するようになりました.
その際,簡易指定の式として解釈できない場合は
そのまま OGNL の Map リテラルの一部として解釈
するようになりました.
問題の変換ルールは変換先に . が含まれているため
簡易指定の式としては解釈できず,OGNL 式と判断
されます.
しかし,簡易指定ではないと判断しているので
変換元を ' で囲む処理は行われず,そのまま
#{ testEntityHead.productCode : productCode,
testEntityHead.status : status }
という Map リテラルとなります.
この OGNL 式は変換元オブジェクトをコンテキストとして
評価されるため,変換元に testEntityHead という
プロパティがないと例外になります.
結論としては,正しい簡易指定を書くか,正しい
OGNL 式を書くかのどちらかが必要で,その範囲では
2.4.17 以前と 2.4.18 以降では同等の動きを
するはずです.
そんなわけで (どんなわけで?),上記のアノテーションは
元々不正で効果もなく,削除していただくのが
手っ取り早くてよろしいかと.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内