データ型が合わないと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>