【问题标题】:Show error details when throwing Validator Exception抛出验证器异常时显示错误详细信息
【发布时间】:2012-06-20 09:26:21
【问题描述】:

我在托管 bean 中有代码:

public void setTestProp(String newProp) {
   FacesMessage yourFailure = new FacesMessage();
   yourFailure.setDetail("Really you need to promise to never do that again!");
   yourFailure.setSummary("Stop here, now!");
   yourFailure.setSeverity(FacesMessage.SEVERITY_FATAL);
   throw new ValidatorException(yourFailure);
}

在 XPage 中:

<xp:messages id="messages1" layout="table" showSummary="false"
    showDetail="true" globalOnly="false">
</xp:messages>

但我得到了结果消息(如预期的那样很好地在黄色框中,而不是在错误页面中):

Error setting property 'testProp' in bean of type com.ibm.sg.demo.Test: javax.faces.validator.ValidatorException: Stop here, now!

我想:

  • 没有技术部分
  • 查看摘要

我错过了什么?

【问题讨论】:

    标签: validation jsf xpages


    【解决方案1】:

    问题在于属性解析器从托管 bean 的 get/set 方法中捕获了所有 java.lang.Throwable。 “原始”facesMessage 被替换为新的(附加上一条消息)。

    你有三种可能:

    1. 创建您自己的属性解析器
    2. 创建您自己的验证器并将其附加到绑定到托管 bean 的字段
    3. 向您的 bean 添加验证方法

    希望对你有帮助

    斯文

    编辑:

    如何为你的 bean 添加验证方法

    a) 为你的 bean 添加一个验证方法

    public void validate(FacesContext context, UIComponent toValidate,  Object value){
    
        // Do your validation with value
        // if everything is ok, exit method
    
        // if not, flag component invalid...
        ((UIInput)toValidate).setValid(false);
    
        // ... create your message ...
        FacesMessage yourFailure = new FacesMessage();
        yourFailure.setDetail("Really you need to promise to never do that again!");
        yourFailure.setSummary("Stop here, now!");
        yourFailure.setSeverity(FacesMessage.SEVERITY_FATAL);
    
        context.addMessage(toValidate.getClientId(context),  yourFailure);
    }
    

    b) 将您的验证器添加到该字段

    <xp:inputText id="inputText1"
    value="#{TBean.test}"
    validator="#{TBean.validate}">
    

    (您可以随意命名该方法。)

    此验证器要添加到 faces-config.xml。

    【讨论】:

    • 感谢您的洞察力。我可以给bean添加一个验证函数,没问题。有没有办法在提交时自动调用该函数,或者我需要使用 onSubmit 事件(没有数据源就不存在)或按钮中的代码?
    • 有没有办法在bean中自动调用验证方法?或者我是否需要在 onSubmit 事件中调用验证(没有数据源就不存在)。 faces-config.xml 中还需要一个自定义验证器。或者我可以以编程方式附加它吗?
    • 该方法被“自动”调用。不需要自定义验证器。我在上面的答案中添加了一个示例。
    • 太酷了。多谢。这正是我想要的。我想我可以使用 this.validators 并且有多个函数调用
    • 不,您不能使用验证器属性,因为不允许使用 EL。该属性仅适用于已注册的验证器(实现验证器接口并添加到 faces-config.xml 的类)。
    【解决方案2】:

    一旦您确定您的字段未通过验证,您所需要做的就是执行此操作,您将得到您想要的:

    throw new javax.faces.validator.ValidatorException(new javax.faces.application.FacesMessage("Stop here, now!"));
    

    【讨论】:

    • Jeremy -> 这就是我的代码所做的,只是多行。错误框已正确触发,但既不显示详细信息(仅显示摘要),也不存在带有“bean”的前面部分。好像它覆盖了摘要,有点。所以问题仍然存在
    • @stwissel,即使在页面加载具有绑定到该字段的项目之前,您的代码也在更新模型阶段执行,我的假设是 Jeremy 在调用应用程序或验证阶段之后发生页面提交。你的意思是每次加载都会失败?
    • @stwissel 是正确的 - 我没有注意到你在 setter 中这样做。不要那样做。您想使用验证器进行验证,因此它在流程验证阶段执行。我前段时间在 XPagesBlog 上写了一篇文章 - 你可以在这里阅读:xpagesblog.com/XPagesHome.nsf/…
    • 欣赏答案! Toby:只有在提交时才会失败(它在 set 事件中)。 Jeremy:那是我借用代码的地方。我想我需要在 bean 中添加一些东西......回到绘图板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2013-03-18
    • 2013-06-18
    • 2019-01-08
    相关资源
    最近更新 更多