web-dev-qa-db-ja.com

JSFでアプリケーションのエラーを表示する方法は?

私のJSF/Faceletsアプリでは、フォームの一部を簡略化したバージョンを以下に示します。

<h:form id="myform">
  <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
  <h:message class="error" for="newPassword1" />
  <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
  <h:message class="error" for="newPassword2" />
  <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>

ContinueButton()メソッドで発生した何かに基づいて、特定のh:messageタグにエラーを割り当てることができます。 newPasswordとnewPassword2には異なるエラーを表示する必要があります。 (DBから)結果を配信するメソッドはcontinueButton()メソッドで実行され、2回実行するには高すぎるため、バリデーターは実際には機能しません。

ページには複数の場所があり、異なるエラーメッセージを表示する必要があるため、h:messagesタグは使用できません。これを試したとき、ページにはすべてのメッセージの複製が表示されました。

私はこれを最善の推測として試しましたが、運はありません:

public Navigation continueButton() {
  ...
  expensiveMethod();
  if(...) {
    FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough."));
  }
}

私は何が欠けていますか?助けていただければ幸いです!

39
Eric Noob

誰かが興味を持っている場合、私はあなたのすべての回答を組み合わせてこれを理解することができました!

これはFaceletにあります:

<h:form id="myform">
  <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
  <h:message class="error" for="newPassword1" id="newPassword1Error" />
  <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
  <h:message class="error" for="newPassword2" id="newPassword2Error" />
  <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>

これはcontinueButton()メソッドにあります:

FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH));

そしてそれは動作します!助けてくれてありがとう!

24
Eric Noob

FacesContext.addMessage(String、FacesMessage) コンポーネントのclientIdが必要ですnotそれはid。理由がわからない場合は、コントロールをdataTableの子として使用し、各行に同じコントロールを使用して異なる値をスタンプすることを検討してください。行ごとに異なるメッセージを印刷することができます。 idは常に同じです。 clientIdは行ごとに一意です。

したがって、「myform:mybutton」は正しい値ですが、これをハードコーディングすることはお勧めできません。ルックアップにより、ビューとビジネスロジック間の結合が少なくなり、ポートレットなどのより制限的な環境で機能するアプローチになります。

<f:view>
  <h:form>
    <h:commandButton id="mybutton" value="click"
      binding="#{showMessageAction.mybutton}"
      action="#{showMessageAction.validatePassword}" />
    <h:message for="mybutton" />
  </h:form>
</f:view>

マネージドBeanロジック:

/** Must be request scope for binding */
public class ShowMessageAction {

    private UIComponent mybutton;

    private boolean isOK = false;

    public String validatePassword() {
        if (isOK) {
            return "ok";
        }
        else {
            // invalid
            FacesMessage message = new FacesMessage("Invalid password length");
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(mybutton.getClientId(context), message);
        }
        return null;
    }

    public void setMybutton(UIComponent mybutton) {
        this.mybutton = mybutton;
    }

    public UIComponent getMybutton() {
        return mybutton;
    }
}
57
McDowell

また、addMessage()への呼び出しにFormIDを含める必要があります。

 FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough."));

これでうまくいくはずです。

よろしく。

6
huo73

覚えておいてください:

FacesContext context = FacesContext.getCurrentInstance();
context.addMessage( null, new FacesMessage( "The message to display in client" ));            

nullが最初のパラメーターとして指定されている場合、フォーム全体に適用されるため、これも有効です。

詳細: coreservlets.com //古い

4
InfZero

JSFは獣です。何かが足りないかもしれませんが、Beanのプロパティに目的のメッセージを保存し、outputTextを介してプロパティを表示することで、同様の問題を解決していました。

<h:outputText
    value="#{CreateNewPasswordBean.errorMessage}"
    render="#{CreateNewPasswordBean.errorMessage != null}" />
2
Jan Zich

グーグル中に this が見つかりました。 2番目の投稿では、エラーメッセージが失われる可能性のあるJSFのさまざまなフェーズについて説明します。また、newPasswordというIDを持つオブジェクトがないため、「newPassword」の代わりにnullを試してください。

1
kevindaub

私はこれを最善の推測として試しましたが、運はありません:

私には正しいようです。メッセージの重大度を明示的に設定しようとしましたか?また、IDはコンポーネントのIDと同じである必要があると思います(つまり、newPassword1またはnewPassword2を使用する必要があります。これらはIDであり、例のnewPasswordではありません)。

FacesContext.getCurrentInstance().addMessage("newPassword1", 
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message"));

次に、<h:message for="newPassword1" />を使用して、JSFページにエラーメッセージを表示します。

1
user7094

単純な答え、特定のコンポーネントにバインドする必要がない場合...

Java:

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Authentication failed", null);
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, message);      

XHTML:

            <h:messages></h:messages>