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

标签 java jsf exception

我到处搜索,我正在尝试一切,没有成功,只有一个真正的异常(exception)。
我需要抛出一个异常,以便它“忽略”方法点之后的所有内容(单个返回是不够的,因为上面还有更多方法),所以我发现了这样的内容:

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:commandButtonaction="#{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 block 中使用它,它会按预期抛出异常(消息),但如果我手动添加 FacesMessage ,它永远不会在 View 中呈现。到FacesContext并抛出正在捕获的异常,同样的情况发生, View 中没有错误消息,例如:

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

这两种解决方案都不起作用,我正在使用 JSF、PrimeFaces 和 Tomcat 8。

最佳答案

从托管 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 block 中并抛出捕获的异常。

关于java - JSF 在 h :message 中显示抛出的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937864/

相关文章:

java - 使用 Java SDK 进行 Azure Cosmos DB Gremlin/Tinkerpop token 身份验证

java - 使用参数制作handleFileupload以共享方法

java - 根据 boolean 条件使用星号强制必填字段

java - java - 如何在Java Web应用程序中将字节[]作为pdf发送到浏览器?

c++ - 无法捕获异常

java - PatternSyntaxException 可能有多种原因吗?

visual-studio-2010 - 如何快速告诉 Visual Studio 在每个异常时停止

java - 无法从 java swing 应用程序创建可执行 jar

java - 编译错误: "cannot find symbol"

java - 当我对依赖项进行一些 pom 更改时,Intellij 会自动下载。这个 mvn install 是否在后台运行?