[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 メーリングリストの案内