我正在尝试将正常的 bean 验证附加到以编程方式生成的 Primefaces UIComponent 上的模糊事件。
如果我使用 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,这不是我在这里想要做的。我希望行为与未指定侦听器时的标记相同,即验证字段。