0

に例外メッセージを設定しようとしてい<h:message>ます。

関連するビューコードは次のとおりです。

<h:inputText id="titleId" value="#{bookController.book.title}"/>                        
<h:message for="titleId"/>
<h:commandButton value="Create a book" actionListener="#{bookController.doCreateBook}" action="listBooks"/>

titleIdが空のときに表示されるメッセージが必要です。タイトルが空の場合、私の@StatelessEJB メソッドは例外をスローします。

public Book createBook(Book book) throws CustomException {
    if(book.getTitle().isEmpty()) {
        throw new CustomException("Please, type a Title !");
    }   
    else {
        em.persist(book);
        return book;
    }       
}

バッキング Bean がそれをキャッチし、メッセージを設定します。

public void doCreateBook() {
    FacesContext ctx = FacesContext.getCurrentInstance();
    try {
        book = bookEJB.createBook(book);
        bookList = bookEJB.findBooks();
    } catch (CustomException e) {
        ctx.addMessage("titleId", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
    }                               
}

私が例外を除いて、例外が発生した場合、入力テキストタグの近くにエラーメッセージを表示する必要がありますが、そうではなく、実行すると書籍の一覧ページが表示され、一覧の下に「エラー」メッセージが表示され、以下に示すように:

書籍一覧

入力フィールドの横に完全な例外メッセージを表示するにはどうすればよいですか?

4

3 に答える 3

1
 ctx.addMessage("titleId", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));

あなたのメッセージテキストはエラーであり、あなたは同じようになっています。ここの「エラー」を好きなように変更してください。

于 2012-05-31T21:29:24.443 に答える
1

Thinksteep が既に回答した誤ったメッセージ処理とは別に、あなたのもう 1 つの間違いは、アクション メソッドで検証を行っていることです。これは正しくないです。代わりに、JSF 組み込みの検証機能を使用する必要があります。JSF 組み込みの検証が失敗するたびに、アクション メソッドは呼び出されず、ページも移動しません。エンドユーザーは現在のフォームに固執し、メッセージはそのために指定された<h:message>タグに表示されます。

特定のケースでは、required属性を設定するだけです。

<h:inputText id="titleId" value="#{bookController.book.title}" required="true" />
<h:message for="titleId" />

デフォルトの必須メッセージをカスタマイズする場合は、requiredMessage属性を使用します。

<h:inputText id="titleId" value="#{bookController.book.title}" 
    required="true" requiredMessage="Please, type a Title !" />
<h:message for="titleId" />

その入力検証を EJB メソッドから削除します。それはそこに属していません。EJB はその責任を負いません。呼び出し元 (この場合は JSF コード) が責任を負います。

于 2012-06-01T03:41:13.003 に答える
1

置く<h:messages showDetail="true" />

于 2015-01-21T20:42:37.173 に答える