如何在<h:message>?</h:message>中设置异常消息

时间:2012-05-31 21:19:55

标签: jsf exception-handling message

我正在尝试在<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为空时,我需要显示一条消息。当标题为空时,我的@Stateless EJB方法抛出异常:

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()));
    }                               
}

除了之外,当发生异常时,必须在输入文本标记附近显示错误消息,但实际情况并非如此,执行会显示包含书籍列表的页面,并显示“错误”消息列表,如下所示:

List of Books

如何在输入字段旁边显示完整的异常消息?

3 个答案:

答案 0 :(得分:1)

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

您的消息文本是错误,您正在变得相同。将“错误”更改为您想要的内容。

答案 1 :(得分:1)

除了Thinksteep已经回答的错误信息处理之外,你的另一个错误是你在动作方法中进行验证。这个不对。您应该使用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代码)对此负责。

答案 2 :(得分:1)

PUT <h:messages showDetail="true" />