データ型が合わないとDtoにDIできないなら例外出せないのかな?の調査
http://d.hatena.ne.jp/moto0215/20060901/1157070820
遅れましたが、試してみました。
結論からいうと、parseFloatしてもしなくても正常に動作しました。
そして、型が合わない場合は正常にエラーメッセージが表示されます。
試した環境は、S2JSF1.0系です(S2JSF1.0.16)
まず、HTMLはadd.htmlを改良してmoto0215さんのHTMLに近づけました(ほぼ同じです)
<html xmlns:m="http://www.seasar.org/maya"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" /> <title>Test</title> </head> <body> <form m:id="form1" m:method="post"> <a m:id="dummy1" m:action="#{testAction.calculate}"/> <input type="hidden" m:value="#{testDto.arg1}" m:id="arg1"/> <input type="hidden" m:value="#{testDto.arg2}" m:id="arg2"/> <span m:value="#{testDto.result}"/> <input type="button" value="test" onclick="doAction();"/><br/> </form> <script type="text/javascript"> <!-- function doAction() { var f=document.forms['form1']; f['form1:arg1'].value = 11.0; f['form1:arg2'].value = 22.0; //f['form1:arg1'].value = parseFloat(11.0); //f['form1:arg2'].value = parseFloat(22.0); f.target=''; f.elements['form1:_link_hidden_'].value='form1:dummy1'; f.submit(); return false; } //--> </script> </body> </html>
Dto, Action及びLogicについてはAddDto, AddAction, AddLogicの名前を変更し
int型の部分を全てdouble型にしてmoto0215さんのソースに近づけました。
※ソースは省略します
上記のHTMLにおいて、画面上のボタンを押すとJavaScriptが動いて、TestAction#calculateが呼ばれます。
この際、parseFloatを実行してもしなくても結果は、33.0と画面に表示されました。
それでは、せっかく試した意味が無いのでもう少し調査してみました。
上記HTML内のdoAction()のJavaScript内の11.0と22.0に対して以下のように文字列を設定しました。
# あきらかに型が異なります。
f['form1:arg1'].value = 'hoge'; f['form1:arg2'].value = 'foo';
この状態で、testボタンを押したところ、Actionは呼ばれず、画面上の表示は、0.0のままで
再表示されたかのように見えます。
これは、Actionが実行されていないのではなくて、実際は変換エラーが生じています。
もとのHTMLに以下の行を追加してみて下さい(bodyタグの下あたりに)
<span m:inject="h:messages" m:globalOnly="false" m:showDetail="true"/>
こうすると、画面上に
-変換エラー "arg1": 正しい値を入力して下さい. -変換エラー "arg2": 正しい値を入力して下さい.
と正しくエラーメッセージが表示されます。
おそらく、このメッセージが表示されていない為に、元のページが再表示されただけに見えたのだと思います。
次に、補足ですが
f['form1:arg1'].value = parseFloat("foo"); f['form1:arg2'].value = parseFloat("hoge");
と変更して、parseFloatを実行した場合は
画面上に NaN と表示されました。
ということで、型変換のエラーはエラーメッセージとして取得出来ていたという事になりますね。
例えば、同じ現象を再現するには、s2jsf-exampleのadd.htmlにおいて、次の1行をHTMLから削除します。
<span m:inject="h:messages" m:globalOnly="false" m:showDetail="true"/>
そして、数値以外をテキストボックスに入力してcalculateボタンを押すと
今回と同じ現象になると思います。
補足になりますが、何かしらエラーが起こったかどうかを判定するには
s2jsf-exampleのvalidator.htmlにあるように、下記をHTMLに記述することにより
エラーが起こったかどうかを判定出来ます。
<span m:rendered="#{errorMessageFinder.errorMessage}">なにかエラーが起こったみたい!!!</span>