如何将ajax验证添加到以编程方式生成的primefaces组件

时间:2012-10-09 20:22:10

标签: jsf jsf-2 primefaces

我正在尝试将常规bean验证附加到以编程方式生成的Primefaces UIComponent上的blur事件。

如果我使用xhtml手动创建组件,它可以正常工作,它看起来像这样:

<p:inputText id="customerName" value="#{editCustomerBean.name}" label="Name">
    <p:ajax async="true" event="blur" update="customerName, customerNameMsg" />
</p:inputText>

不幸的是,我需要动态生成这个组件,因为一些动态属性将根据运行时数据填充。我写的代码试图完全复制这个组件:

UIInput input = new InputText();

AjaxBehavior ajax = new AjaxBehavior();
ajax.setAsync(true);
ajax.setUpdate("customerName, customerNameMsg");
input.addClientBehavior("blur", ajax);
input.setId("customerName");
input.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{editCustomerBean.name}", String.class));

当我以这种方式生成此组件时,我看到在blur事件上发送到服务器的请求,但是没有进行验证。发布的请求看起来与我在xhtml中指定组件时发送的请求相同:

javax.faces.partial.ajax=true&javax.faces.source=mainForm%3AcustomerName&javax.faces.partial.execute=mainForm%3AcustomerName&javax.faces.partial.render=mainForm%3AcustomerName+mainForm%3AcustomerNameMsg&javax.faces.behavior.event=blur&javax.faces.partial.event=blur&mainForm%3AcustomerName=&javax.faces.ViewState=8176624577669857830%3A-4154840965136338204

我在本网站和Primefaces论坛上发布了类似的问题,但它通常涉及将一个监听器方法附加到AjaxBehavior,这不是我在这里尝试做的。当没有指定监听器时,我希望行为与标签相同,即验证字段。

2 个答案:

答案 0 :(得分:2)

动态添加onBlur事件的示例

   Message message=new Message();
    message.setId("msg");
    InputText it = new InputText();
    it.setId("input1");
    it.setRequired(true);
    message.setFor(it.getId());

    //******Setting validation render at onBlur event
    AjaxBehavior ajaxBehavior=new AjaxBehavior();
    ajaxBehavior.setAsync(true);
    ajaxBehavior.setUpdate(message.getId());
    it.addClientBehavior("blur", ajaxBehavior);
    //************************************************

答案 1 :(得分:1)

原来我正在咆哮着看着ajax组件的错误树。我今天意识到我的组件在提交时也未经过验证。事实证明,当您动态创建JSF组件时,需要手动向组件注册BeanValidator。感谢victor herrera对这个问题的回答:https://stackoverflow.com/a/7055586/1535568