有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSF Primefaces不在blur事件上运行验证程序

情况
我有一个包含p:inputText的p:dataTable。所有这些输入文本都由一个自编的验证器进行验证。此验证器打开一个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>

我的对话豆:

@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中的My Textfield

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

问题
如果在inputText中输入了无效值,验证程序将打开对话框。使用按钮关闭对话框后,inputText将失去焦点并触发模糊事件。这将导致验证程序再次运行,并再次打开对话框

问题
当inputText触发模糊事件时,如何避免验证程序运行


共 (0) 个答案