场合:
我有一个包含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时,如何避免运行验证程序?