p:消息autoUpdate =“true”在p:dataTable单元格编辑事件期间不会自动更新

时间:2015-07-29 17:47:55

标签: validation jsf primefaces datatable messages

我对可编辑数据表有两个问题,其中包含一个执行业务逻辑验证的自定义验证程序。

第一个问题是当自定义验证程序抛出验证异常时,它们不会显示在p:growl或p:messages中。但该字段突出显示为红色,因此我知道验证失败了。根据autoUpdate =“true”属性,邮件是否应自动显示?

第二个问题是,假设用户输入了无效值,因此验证失败,用户仍然点击“保存”按钮。我期待Primefaces再次调用验证,而不是执行操作。但是,会调用commandButton的操作(仅使用用户提供的无效值更新模型)。我期望在没有再次运行验证阶段的情况下不会调用Invoke Application阶段?当我调试我的验证器时,调用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。

1 个答案:

答案 0 :(得分:-1)

从未使用过这样的验证器,但我认为您应该将您的信息添加到上下文中。

context.getCurrentInstance().addMessage(null, msg);