对于带有执行业务逻辑验证的自定义验证器的可编辑数据表,我有两个问题。
第一个问题是,当自定义验证器抛出验证异常时,这些异常不会显示在p:growl或p:消息中。但是该字段显示为红色,因此我知道验证失败了。消息不应该自动显示为每个autouupdate ="true"属性吗?
第二个问题是,假设用户输入了一个无效的值,所以验证失败,用户还是点击了"保存"按钮。我期望Primefaces再次调用验证,而不是执行操作。但是,调用commandButton的操作(只有模型没有使用用户提供的无效值更新)。我期望调用应用程序阶段不会被调用而不再次运行验证阶段?当我调试我的验证器被调用后,命令按钮动作被调用。
我有一个主页,其中包括另一个xhtml文件(一个对话框的代码),有一个表单和一个咆哮。
main.xhtml
<ui:include src="/pages/dialog.xhtml" />
<h:form id="form">
<p:growl id="msgs" showDetail="true"/>
...more code
和显示可编辑数据表的对话框 dialog.xhtml
<p:dialog>
<h:form id="dialogForm">
<p:growl id="msgs" showDetail="true" />
<p:messages id="messages" showDetail="true" autoUpdate="true" />
<p:dataTable editable="true" editMode="cell" value"#{myBean.list}"
var="item">
<p:columns value="#{myBean.columns}" var="column">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item[column].value}"/>
</f:facet>
<f:facet name="input">
<p:inputText value="{item[column].value}" validator="inputValidator">
<pe:keyFilter mask="pnum" />
</p:input>
</f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
<p:commandButton value="Save" action="#{myBean.save}"
update="dialogForm"/>
</h:form>
<p:/dialog>
验证器
@FacesValidator("inputValidator")
public class InputValidator implements Validator{
@Override
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
boolean valid = ...validation code;
if(!valid){
FacesMessage msg = new FacesMessage("Invalid", "Invalid value provided.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
((UIInput)component).setValid(false);
throw new ValidatorException(msg);
}
}
}
我使用的是primefaces 5.2和myfaces 2.0
从未使用过这样的验证器,但我认为您应该将您的消息添加到上下文中。
context.getCurrentInstance().addMessage(null, msg);