gpt4 book ai didi

validation - 使用自定义验证器验证失败时如何跳过操作?

转载 作者:行者123 更新时间:2023-12-04 06:25:04 25 4
gpt4 key购买 nike

我有一个用于图书馆的小型网络应用程序,带有定制的 ISBN 验证器。我用于添加书籍的 .xhtml 页面如下所示:

<fieldset>
<h:messages/>
<ul>
<li>
<h:outputLabel for="isbn" value="#{labels.isbn}:" />
<h:inputText id="isbn" value="#{addController.book.isbn.isbnValue}" required="true" requiredMessage="- ISBN must be filled in.">
<f:validator validatorId="isbnValidator" />
</h:inputText>
</li>
<li>
<h:outputLabel for="title" value="#{labels.title}:" />
<h:inputText id="title" value="#{addController.book.title}" required="true" requiredMessage="- Title must be filled in."/>
</li>
<li>
<h:outputLabel for="name" value="#{labels.name}:" />
<h:inputText id="name" value="#{addController.book.person.name}" required="true" requiredMessage="- Name must be filled in."/>
</li>
<li>
<h:outputLabel for="firstname" value="#{labels.firstname}:" />
<h:inputText id="firstname" value="#{addController.book.person.firstname}" />
</li>

</ul>
<h:commandButton id="addButton" action="#{addController.save}" value="#{labels.add}" />
<h:commandButton id="cancelButton" action="bookOverview" value="#{labels.cancel}" />
</fieldset>
</ui:define>
isbnValidator第一个输入字段是这个类:
private Isbn isbn;

@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
isbn = new Isbn((String) value);
if (!isbn.isIsbn17Characters()) {
addMessageToContext(context, "- ISBN needs to have 17 characters");
}
if (isbn.isIsbn17Characters() && !isbn.isIsbnInRightFormat()) {
addMessageToContext(context, "- Wrong format, it should be like 'XXX-XX-XXX-XXXX-X'");
}
if (isbn.isIsbn17Characters() && isbn.isIsbnInRightFormat() && !isbn.isIsbnFormatValid()) {
addMessageToContext(context, "- ISBN can only contain numbers, and no other tokens");
}
if (isbn.isIsbn17Characters() && isbn.isIsbnInRightFormat() && isbn.isIsbnFormatValid()
&& !isbn.isLastNumberValid()) {
addMessageToContext(context, "- Last number of the ISBN should be " + isbn.getCorrectLastNumber()
+ " with those 12 numbers");
}

}

public static void addMessageToContext(FacesContext context, String message) {
FacesMessage facesMessage = new FacesMessage();
facesMessage.setSummary(message);
facesMessage.setDetail(message);
context.addMessage("isbn", facesMessage);
}

当我点击“添加”按钮时,这本书应该被添加到数据库中。

当 ISBNfield、namefield 或 titlefield 未填写时,我收到相应的错误消息。但是当我填写了字段并且 ISBN 验证失败时,他会显示错误消息,但他仍然将这本书(带有错误的 ISBN 编号)添加到数据库中。

我想到的一个解决方案:如果我的消息标签不为空,他不应该将这本书添加到数据库中。但我怎么能检查呢?

或者我的问题有更好的解决方案吗?

最佳答案

验证错误消息处理是错误的。您需要 ValidatorExceptionFacesMessage而不是添加 FacesMessage手动。

所以而不是所有这些

addMessageToContext(context, "- ISBN needs to have 17 characters");

你需要做

throw new ValidatorException(new FacesMessage("- ISBN needs to have 17 characters"));

这是 JSF 标志,表明输入无效,因此不会调用操作方法。您也不需要指定客户端 ID,它会以 <h:message> 结尾。与触发此验证器的输入组件相关联。

关于validation - 使用自定义验证器验证失败时如何跳过操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com