JSF在h:message中显示抛出的消息

时间:2014-05-29 16:11:43

标签: java jsf exception-handling

我到处搜索,我正在尝试一切,没有成功的真正例外..
我需要抛出一个异常,所以它'忽略'方法点之后的所有东西(单个返回不够,因为上面有更多的方法)所以我找到了这样的东西:

throw new javax.faces.validator.ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, ex instanceof ValidationException ? ex.getMessage() : MessageProvider.getMessage("sales.insert.error"), null));

编辑1
(这是在void method(@ViewScoped)的ManagedBean内完成的,该方法是从p:commandButton调用action="#{something}"

编辑2
按钮:

<p:commandLink id="finalizarBtn" action="#{vendaMB.finalizarVenda()}"  update="@form" process="@this, vendaList" styleClass="btn btn-regalo margin-side-5 btn-block" title="#{msg['sales.add']}" style="width: 500px; display: inline-block; margin: 20px 0px;" ><i class="fa fa-fw fa-2x fa-check"></i></p:commandLink>

完整的方法:

public void finalizarVenda() throws ValidatorException {
    if(vendaProdutos.size() < 1) {
        FacesUtil.addErrorMessage("vendaForm:produto", "");
        return;
    }
    venda.setDataVenda(new Date());
    try {
        venda = vendaBO.incluir(venda, vendaProdutos);
    } catch(Exception ex) {
        venda.setDataVenda(null);
        vendaBO.getDB().rollbackTransaction();
        throw new javax.faces.validator.ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, ex instanceof ValidationException ? ex.getMessage() : MessageProvider.getMessage("sales.insert.error"), null));
    }
    FacesUtil.addInfoMessage(MessageProvider.getMessage("sales.insert.success"));
    novaVenda();
}

消息组件:

<p:messages id="messages" autoUpdate="true" globalOnly="true" showSummary="true" showDetail="false" escape="false" rendered="true" closable="true" />


我在我的try / catch块中使用它,它会按预期抛出异常(消息),但它永远不会在视图中呈现,如果我手动将FacesMessage添加到FacesContext并抛出异常正在捕获,同样的情况发生,视图中没有错误消息,例如:

try {
  //something
} catch (Exception ex) {
  FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("something"));
  throw ex;
}

两种解决方案都不起作用,我使用的是JSF,PrimeFaces和Tomcat 8。

1 个答案:

答案 0 :(得分:1)

从托管bean中抛出ValidatorException将不会设置消息。 以下是否有效:

public void finalizarVenda() throws ValidatorException {
    if(vendaProdutos.size() < 1) {
        FacesUtil.addErrorMessage("vendaForm:produto", "");
        return;
    }
    venda.setDataVenda(new Date());
    try {
        venda = vendaBO.incluir(venda, vendaProdutos);
        FacesUtil.addInfoMessage(MessageProvider.getMessage("sales.insert.success"));
        novaVenda();
    } catch(Exception ex) {
        venda.setDataVenda(null);
        vendaBO.getDB().rollbackTransaction();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, ex instanceof ValidationException ? ex.getMessage() : MessageProvider.getMessage("sales.insert.error"), null));
    }
}

如果novaVenda()方法也可以抛出异常,您可能还希望将其包装在try catch块中并抛出捕获的异常。