昔のホラー映画でなんかテレビに悪霊がいてって話があったけど、うちのPCも最近やたらと怪奇現象が多い。どうもこれにも悪霊が取り憑いたっぽい…。そう、うちのPCでは悪魔の言葉とおぼしき意味不明の文章がログにたまるは、血で綴られたような赤いエラーメッセージが出るは、独りでにプログラムが停止するは…。そのうち本人もバグの階段を…
┌(。ρ。┌ )┐三三三 …て感じで降りていくに違いない。(ネタ古過ぎ…)
さてさて、映画ではエクソシストが悪霊を退治してくれるらしいけども、現実エクソシストと思って頼ったフレームワーク(JSF)が悪霊以上に凶悪な気がするこの頃。…いや、でも実はそれは、おいらが既にアンチパターンに取り憑かれていて…だからエクソシストが憎いのか(恐)!…そんな感じの今日のネタ…。(つまり、簡単すぎてJSFが間違ってるとも思えない…何かおいらに見落としがあるに違いないって事(爆!!))
まず、コンバータを設定したValueExpressionを参照する入力コンポーネントを用意。それに空の文字列を入力、そして他のコンポーネントにValidationフェーズで検証エラーの起きる値を入力してサブミット。すると空の文字列を入力したはずなのに…ValueExpressionの値が優先されて元に戻っちゃう…。
<h:form>
<-- 検証エラーをおこすために何も入力しない -->
<h:inputText id="required" required="#{true}"/>
<h:message for="required"/>
<-- 空文字を入力しても元の値に戻る -->
<h:inputText id="hasInitial" value="#{testBean.value}">
<f:convertNumber integerOnly="true"/>
</h:inputText>
<h:message for="hasInitial"/>
<h:commandButton/>
</h:form>
どうもコンバータがnullを返して、それがlocalValueとして設定されて、最後のgetValue()がJavaDocによると、localValueがnullならValueExpressionを使うって書いてあるので、たぶんこれだ…。うーん、isLocalValueSetとかで切り分けてくれると思ってたんだけど…違うみたい。
うーん、、、単純なんだけど汎用的な解決策が見つからない…。JSFの欠陥?なわけないよな…こんな単純な所で…。とするとおいらの理解が足りてないって事か…うーん。


