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 已经回答的错误消息处理之外,您的另一个错误是您正在操作方法中进行验证。这个不对。您应该改用 JSF 内置验证工具。每当 JSF 内置验证失败时,将不会调用 action 方法并且页面也不会导航。最终用户坚持当前表单,消息将出现在为此指定的<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 回答