web-dev-qa-db-ja.com

フォームコンポーネントには、その祖先にUIFormが必要です。提案:必要なコンポーネントを<h:form>で囲みます

私のフォームは次のとおりです。

<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>内に配置する必要があります。

38
Thang Pham

これは単なるWarningではなくErrorです。通常、警告は開発者に技術的なエラー/問題をすぐに引き起こさないかもしれない予期しない状況/状態を知らせるためにあります。何も問題なく機能する場合もありますが、おそらく動作/結果は開発者が意図したとおりではない可能性があります。たとえば、初心者の開発者が<form>の代わりに<h:form>を誤って使用した可能性があります。このような警告は役に立ちます。

特定のケースでは、非JSFサービスに送信する必要があるため、単に<form>の使用を強制されます。より経験豊富な開発者として、あなたはそれが合法的に有効であることを知っています。この警告は無視してかまいません。この警告は、javax.faces.PROJECT_STAGEDevelopmentに設定されている場合にのみ表示され、Productionに設定されている場合はnotが表示されます。

ただし、フォームとその入力子の間にpanelgridのような別のコンポーネントがある場合に警告が表示されることは、バグです。私はそれをモジャラに報告します。すべての親ではなく、直接の親のみをチェックしているように見えます。 Update:Mojarra 2.1.3/2.2に従って修正されました。 issue 2147 も参照してください。

これは、Glassfish固有ではありません。新しいGFバージョンのコースには、これらの警告が実装された新しいMojarraバージョンが付属しています。 issue 166 も参照してください。

関連する質問:

47
BalusC

これは、OlegがPrimeFacesフォーラムおよび作品から提案したものです。

<h:form id="login" prependId="false"
                onsubmit="document.getElementById('login').action='j_security_check';">

よろしく、ブレンダン。

16
Oversteer

Web設定に基づいてJSF開発を行っている場合にのみ表示されます。

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

プロダクションに変更すると、表示されなくなります

4
Carlo Pacheco

誰かがいつかこの便利なものを見つけると、同じエラーが発生し、問題はprimefacesコンポーネントがあることでした

<p:something ....

そのコンポーネントは<h:form>要素内にありませんでした

3
jNick

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も表示されていると、より簡単になります。

1
Harun

私の場合、この警告メッセージはp:messages検証エラーを表示するためにダイアログに入れたので、今すぐseverity="error"in p:messagesおよび警告メッセージはなくなりました。

0
matoni