私のフォームは次のとおりです。
<form action="j_security_check">
<h:panelGrid columns="2" bgcolor="#eff5fa" cellspacing="5" frame="box" styleClass="center">
<h:outputLabel value="User ID:"/>
<h:inputText id="j_username" tabindex="1" />
<h:outputLabel value="Password:"/>
<h:inputSecret id="j_password"/>
<h:outputLabel value=""/>
<h:commandButton id="login" value="Login"/>
</h:panelGrid>
</form>
Glassfish 3.0.1では正常に動作しますが、Glassfish 3.1 b2以降、JSFページでこの警告がFacesMessage
として表示されます。
フォームコンポーネントには、その祖先にUIFormが必要です。提案:必要なコンポーネントを
<h:form>
で囲む
<form action="j_security_check">
を<h:form>
に変更しても、修正されません。<h:form>
を<h:panelGrid>
内に配置する必要があります。
これは単なるWarningではなくErrorです。通常、警告は開発者に技術的なエラー/問題をすぐに引き起こさないかもしれない予期しない状況/状態を知らせるためにあります。何も問題なく機能する場合もありますが、おそらく動作/結果は開発者が意図したとおりではない可能性があります。たとえば、初心者の開発者が<form>
の代わりに<h:form>
を誤って使用した可能性があります。このような警告は役に立ちます。
特定のケースでは、非JSFサービスに送信する必要があるため、単に<form>
の使用を強制されます。より経験豊富な開発者として、あなたはそれが合法的に有効であることを知っています。この警告は無視してかまいません。この警告は、javax.faces.PROJECT_STAGE
がDevelopment
に設定されている場合にのみ表示され、Production
に設定されている場合はnotが表示されます。
ただし、フォームとその入力子の間にpanelgridのような別のコンポーネントがある場合に警告が表示されることは、バグです。私はそれをモジャラに報告します。すべての親ではなく、直接の親のみをチェックしているように見えます。 Update:Mojarra 2.1.3/2.2に従って修正されました。 issue 2147 も参照してください。
これは、Glassfish固有ではありません。新しいGFバージョンのコースには、これらの警告が実装された新しいMojarraバージョンが付属しています。 issue 166 も参照してください。
これは、OlegがPrimeFacesフォーラムおよび作品から提案したものです。
<h:form id="login" prependId="false"
onsubmit="document.getElementById('login').action='j_security_check';">
よろしく、ブレンダン。
Web設定に基づいてJSF開発を行っている場合にのみ表示されます。
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
プロダクションに変更すると、表示されなくなります
誰かがいつかこの便利なものを見つけると、同じエラーが発生し、問題はprimefacesコンポーネントがあることでした
<p:something ....
そのコンポーネントは<h:form>
要素内にありませんでした
Mojarra 2.1.27を使用していますが、これが私の間違いであることがわかります。しかし、間違いが何であるかを見つけるのは非常に困難です。 Mojarraの誰かが警告メッセージにコンポーネントIDを追加できることを願っています。コンポーネントを見つけるために私がやったことは次のとおりです:(これも https://code.google.com/p/primefaces/issues/detail?id=1586#c48 に投稿されました)
Mojarraのソースコードをダウンロードし、メソッド内のcom.Sun.faces.context.FacesContextImplクラスにブレークポイントを追加することでトレースします:public void addMessage(String clientId、FacesMessage message)。ブレークポイントがキャッチされたら、デバッグウィンドウを開くか、スタックウィンドウを呼び出して、メソッドprivate static void addFormOmittedMessage(FacesContext context)のメソッドcomのクラスcom.Sun.faces.application.view.FormOmittedCheckerによって呼び出されたことを確認します。
public static void check(FacesContext context)。
checkメソッド内には、パラメーター変数コンポーネントがあります。ウォッチまたは変数ウィンドウからコンポーネントIDを取得し、それをHTMLページとコードにトレースバックできます。
難しい方法ですが、問題の根本を見つけることができることを願っています。警告メッセージに問題のあるコンポーネントIDも表示されていると、より簡単になります。
私の場合、この警告メッセージはp:messages
検証エラーを表示するためにダイアログに入れたので、今すぐseverity="error"
in p:messages
および警告メッセージはなくなりました。