- PR -

JSFの警告について

投稿者投稿内容
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-05-22 18:35
JSFで画面を遷移した際に、コンソールに下記のようなログが出力されるのですが
原因がよく分かりません。警告を無視して操作しても特に問題なく動作するのですが
このメッセージについてご存じの方アドバイスお願いします。
(出力されるときは必ず2行対で出力されます。)

・J2SE5.0
・Tomcat5.0.28
・MyFaces1.1.1

=======================================================================

2006/05/22 18:22:36 org.apache.myfaces.renderkit.html.HtmlRendererUtils decodeUIInput
警告: There should always be a submitted value for an input if it is rendered, its form is submitted, and it is not disabled or read-only.
2006/05/22 18:22:36 org.apache.myfaces.renderkit.html.HtmlRendererUtils decodeUIInput
警告: There should always be a submitted value for an input if it is rendered, its form is submitted, and it is not disabled or read-only.
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-05-23 09:08
MyFaceは詳しくないのですが,メッセージから察するに...

例えば,
<h:form>
<h:inputText value="#{...}"/>
<h:commandButton value="button" action="#{...}"/>
</h:form>
に対して生成するHTMLは
<form id="_id0" method="post" action="...">
<input type="text" name="_id0:_id1"/>
<input type="submit" name="_id0:_id2" value="button"/>
</form>
のようになるので,ボタンを押したときに次のようなパラメタが飛ぶはずです
_id0:_id1=inputText
_id0:_id2=button
_id0=_id0

メッセージの内容は,
 _id0というパラメタが来ているからformがsubmitされているはずなのに,
 期待している_id0:_id1あるいは_id0:_id2が来ていない,
という意味でしょう.

理由として考えられるのは
(1)クライアント側でJavaScriptなどで勝手な編集をしている
(2)htmlを生成したタイミングではdisabled, readonly, !renderedのいずれかになって
 いるフィールドかボタンが,レスポンスを受けるタイミングで,!disabled & !readonly & rendered
になっている.

(2)の原因として典型的なのは,disabledやrenderedにリクエストスコープのバッキング
ビーンをバインドしていることです.

よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-05-23 09:10
メッセージはdecodeUIInputから出ているので入力フィールドの方ですね.
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-05-23 09:32
よしだ様、アドバイス有り難うございました。ご指摘頂いた内容でJSPを確認したところ
該当するような箇所が見つかりました。

下記のようにpanelStackを利用していたのですが条件に沿わない際はレンダリング
されていないものだと解釈おりました。おそらく明示的にrenderedをfalseに設定
してやる必要があるということですよね?早速テストを行ってみたいと思います。

<t:panelStack id="sample" selectedPanel="#{loginAction.userState}">
<h:panelGrid id="guest">
<h:outputText value="社員コード"/>
<h:inputText id="employeeno" value="#{loginAction.employeeCode}"/> ←ここ
<h:outputText value="パスワード"/>
<h:inputSecret id="passwd" value="#{loginAction.passwd}"/> ←ここ
</h:panelGrid>
<h:panelGrid id="login">
<h:outputText value="ようこそ#{loginAction.userInfo.firstName}さん"/>
<h:commandButton value="ログアウト" action="#{loginAction.logout}"/>
</h:panelGrid>
</t:panelStack>
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-05-23 10:25
引用:

下記のようにpanelStackを利用していたのですが条件に沿わない際はレンダリング
されていないものだと解釈おりました。おそらく明示的にrenderedをfalseに設定
してやる必要があるということですよね?

トマホークは使ったことがないので,見当はずれかもしれませんが,
おそらくそういうことではなくて,レンダリングの時と次のリクエストの時とで
状態が違っていることが問題なのではないでしょうか?

最も典型的な原因はリクエストスコープのビーンと使っていることですが,
loginActionはリクエストスコープではありませんか?
セションスコープで試してみてください.
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-05-23 21:21
> 最も典型的な原因はリクエストスコープのビーンと使っていることですが,
> loginActionはリクエストスコープではありませんか?
> セションスコープで試してみてください.

返事有り難うございます。本日、作業が出来ていないのでテスト出来ていませんが
loginActionはfaces-configにてセッションスコープになるように設定しています。
ご指摘頂いた内容を踏まえ、明日再チャレンジしてみます。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-05-24 09:02
引用:

loginActionはfaces-configにてセッションスコープになるように設定しています。


そうですか..ピントはずれな指摘でしたね.
ちなみに,結果を表示する方のJSPに次のようなタグを入れておくと,リクエストパラメタ
の値が確認できますので,お試しください.
<p/><h:outputText value="param= #{param}"/>
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-05-24 17:54
解決しましたので結果を報告させて頂きます。

結論から申し上げると、トマホークのpanelStackを使用した場合に分岐で処理されなかった
と思っていた部分に記述されていたUIコンポーネントもバックエンドでは存在しており、
そのコンポーネントに対する値がサブミット時に渡されなかったのが原因のようです。

従いまして、UIコンポーネントのrenderedを明示的にfalseと指定してやることで現象が
解決しました。

よしだ様には最後までご協力頂き大変有り難うございました。また、別の質問をさせて頂く
こともあるかと思いますがその際は宜しくお願いします。

スキルアップ/キャリアアップ(JOB@IT)