【问题标题】:How to set the exception message in a <h:message>?如何在 <h:message> 中设置异常消息?
【发布时间】:2012-05-31 21:19:55
【问题描述】:

我正在尝试在&lt;h:message&gt; 中设置异常消息。

下面是相关视图代码:

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

我的例外是,当异常发生时,必须在输入文本标签附近显示错误消息,但事实并非如此,执行显示带有书籍列表的页面,并在下方显示“错误”消息列表,如下图:

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

【问题讨论】:

    标签: jsf exception-handling message


    【解决方案1】:

    除了 Thinksteep 已经回答的错误消息处理之外,您的另一个错误是您在操作方法中进行验证。这个不对。您应该改用 JSF 内置验证工具。每当 JSF 内置验证失败时,操作方法将被调用,页面也将导航。最终用户坚持使用当前表单,消息将出现在为此指定的&lt;h:message&gt; 标记中。

    在您的特定情况下,您只需要设置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 代码)对此负责。

    【讨论】:

    • 非常感谢。所以我不得不考虑将业务规则作为 EJB 中的输入验证来管理不是一个好习惯?
    • 您可以使用 EJB 来执行验证,例如检查是否没有违反唯一约束,但这应该在Validator 实现中完成,该实现应该在失败时抛出ValidatorException。 EJB 本身应该只返回 true 或 false 之类的。另见例如stackoverflow.com/questions/6047866/…
    【解决方案2】:
     ctx.addMessage("titleId", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
    

    您的消息文本是错误,您得到的也是一样。将此处的“错误”更改为您想要的任何内容。

    【讨论】:

      【解决方案3】:

      输入&lt;h:messages showDetail="true" /&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 2011-06-12
        • 2017-12-19
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        相关资源
        最近更新 更多