JSF Primefaces不会在模糊事件上运行验证器

时间:2016-12-20 15:31:04

标签: java validation jsf primefaces

场合
我有一个包含p:inputText的p:dataTable。所有这些inputTexts都由自编写的验证器验证。此验证器打开一个p:对话框,在p:messages组件中显示错误消息,在p:commandButton中关闭对话框。当文本输入到inputText并且inputText失去焦点(模糊事件)时,将调用验证器。

我的对话:

<p:dialog id="dlgMessageDialog" dynamic="false" style="z-index: 100"
    closable="false" widgetVar="wigVarDlgMessageDialog" modal="true"
    appendTo="@(body)">
        <p:messages id="messageDialogMessages" autoUpdate="true"
            for="#{messageDialogBean.messageClientId}" closable="false"
            escape="false" showDetail="true" showIcon="true" showSummary="true"></p:messages>
        <p:spacer height="20px"></p:spacer>

        <p:commandButton id="closeMessageDialogBtn" value="#{msg.btnOk}"
            oncomplete="PF('wigVarDlgMessageDialog').hide()"></p:commandButton>
</p:dialog>

我的对话框Bean:

@Named("messageDialogBean")
@SessionScoped
public class MessageDialogBean implements Serializable {

private static final long serialVersionUID = -4258641757966332708L;

private FacesMessage lastMessage;
private final String messageClientId = "messageDialogMessageId";

public MessageDialogBean() {
}

public void showInfo(final String pSummary, final String pDetail) {

    this.lastMessage = new FacesMessage(FacesMessage.SEVERITY_INFO, pSummary, pDetail);
    showCurrentMessage();

}

public void showError(final String pSummary, final String pDetail) {

    this.lastMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, pSummary, pDetail);
    showCurrentMessage();

}

public void showFatal(final String pSummary, final String pDetail) {

    this.lastMessage = new FacesMessage(FacesMessage.SEVERITY_FATAL, pSummary, pDetail);
    showCurrentMessage();

}

public void showWarn(final String pSummary, final String pDetail) {

    this.lastMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, pSummary, pDetail);
    showCurrentMessage();

}

public void showMessage(final FacesMessage pMessage) {

    this.lastMessage = pMessage;
    showCurrentMessage();

}

public FacesMessage getLastMessage() {
    return this.lastMessage;
}

public String getMessageClientId() {
    return this.messageClientId;
}

private void showCurrentMessage() {
    FacesContext.getCurrentInstance().addMessage(this.messageClientId, this.lastMessage);
    RequestContext.getCurrentInstance().execute("PF('wigVarDlgMessageDialog').show()");
}

}

我的验证员:

@FacesValidator("custom.ValueRequiredValidator")
public class ValueRequiredValidator implements Validator, ClientValidator {

@Inject
private MessageDialogBean messageDialogBean;

public ValueRequiredValidator() {
    if (this.messageDialogBean == null) {
        this.messageDialogBean = new MessageDialogBean();
    }
}

@Override
public Map<String, Object> getMetadata() {
    return null;
}

@Override
public String getValidatorId() {
    return "custom.ValueRequiredValidator";
}

@Override
public void validate(final FacesContext context, final UIComponent component, final Object value) throws ValidatorException {
    if (value == null || value.toString().isEmpty()) {
        this.messageDialogBean.showError("Validierung", "Es sind nicht alle notwendigen Werte vorhanden");

        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nicht alle benötigten Werte vorhanden",
                "Es sind nicht in allen benötigten Feldern Werte eingetragen");
        throw new ValidatorException(message);
    }
}

}

p:dataTable中的我的文本字段

<p:inputText id="someId" value="#{myBean.someValue}" style="width:100%">
<f:validator validatorId="custom.ValueRequiredValidator" />
</p:inputText>

问题
如果将无效值放入inputText,验证器将打开该对话框。关闭使用按钮的对话框后,inputText将失去焦点并触发blur-event。这会导致验证程序再次运行并再次打开对话框。

问题
当我的inputText触发blur-event时,如何避免运行验证程序?

0 个答案:

没有答案