在同一个组件中使用 JSF 绑定 + 验证器显示消息两次

Posted

技术标签:

【中文标题】在同一个组件中使用 JSF 绑定 + 验证器显示消息两次【英文标题】:using JSF binding + validator in the same component display message twice 【发布时间】:2012-07-25 11:50:16 【问题描述】:

我有 2 个组件(select 和 inputText),其中的值相互依赖。例如,如果选择“选项 1”,则 inputText 必须是数字。

在我的 bean 中,我添加了用于绑定和验证方法的 2 个组件的属性,而在 jsp 中,我添加了“validator”和“binding”属性来选择和“绑定”到 inputText。

我使用绑定来获取两个组件的提交值以进行验证。

这是正确的方法吗?是否有替代方法来获取提交的值?

这样做的结果是显示重复的消息。如果我从 select 中删除绑定属性,那么它会按预期工作,但我无法获取所选值,而是使用缓存值(会话中的 bean 值)。

提前致谢。

阿尔梅罗

代码:

<p:selectOneMenu
value="#  deploymentRequestViewBean.deploymentRequestDTO.deploymentRequest.requestLevel"
id="requestLevel" required="true" label="requestLevel" 
validator="#deploymentRequestViewBean.validateRequestDate">
<p:ajax listener="#deploymentRequestViewBean.processRequestLevelValueChanged" 
binding="#deploymentRequestViewBean.requestLevelSelectOne"/>
<f:selectItem itemValue="" itemLabel="Select One" />
<f:selectItem itemValue="DEV" itemLabel="DEV" />
<f:selectItem itemValue="QUA" itemLabel="QUA" />
<f:selectItem itemValue="PRD" itemLabel="PRD" />
</p:selectOneMenu>

 <p:calendar
 value="#deploymentRequestViewBean.deploymentRequestDTO.deploymentRequest.deployDate"
 id="deployDate" required="true" label="deployDate" showOn="button" pattern="yyyy-  MM-dd" binding="#deploymentRequestViewBean.requestDateInput"/>
<p:spacer   /> 

//for component-binding
private UISelectOne requestLevelSelectOne;
private UIInput requestDateInput;


//validation method
public void validateRequestDate(FacesContext facesContext,
    UIComponent component, Object newValue)

//get the current value of select;
requestLevelSelectOne.getSubmittedValue();
//get the current vallue of input;
requestDateInput.getSubmittedValue()

if(not valid combination)
           facesContext.addMessage(requestDateInput.getClientId(facesContext), new  FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", selectedLevel + " deployment request requires at least 2 days."));
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Deployment date must be at least 2 days."));


【问题讨论】:

【参考方案1】:

您可以通过将隐藏的组件值与选择组件绑定来使用 hack 绕过。在&lt;h:selectOneMenu&gt; 的“onchange”方法中,您可以设置此隐藏组件的值并获取服务器中的值:

<h:form id="myForm">
    <h:selectOneMenu id="cmbOptions"
        onchange="document.getElementById('myForm:hidSelectOption').value=this.value">
        <f:selectItem itemLabel="Option 1" itemValue="1" />
        <f:selectItem itemLabel="Option 2" itemValue="2" />
        <f:selectItem itemLabel="Option 3" itemValue="3" />
    </h:selectOneMenu>
    <h:inputHidden id="hidSelectOption" value="#bean.selectedOption" />
    <h:commandButton value="Click me" action="#bean.someAction" />
</h:form>

托管 Bean

@RequestScope
@ManagedBean
public class Bean 
    private String selectedOption;
    //getters and setters...
    public Bean() 
    

    public void someAction() 
        //showing the actual value of the hidden component...
        //remember that you should use a logger, this is a basic example
        System.out.println(selectedOption);
    

【讨论】:

我已经尝试了上述解决方案,但检索到的值是模型值。我想在模型更新之前的验证阶段获取值。 您可以将验证应用于隐藏的组件值。

以上是关于在同一个组件中使用 JSF 绑定 + 验证器显示消息两次的主要内容,如果未能解决你的问题,请参考以下文章

组件绑定与 findComponent() - 何时使用哪个?

没有 bean 属性的 JSF 组件绑定

具有渲染属性的jsf组件验证失败

使用 JSR 303 在 JSF 中使用内联消息进行跨字段验证

如何将 JSF 组件绑定到支持 bean 属性

如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)