Как пропустить действие при сбое проверки с помощью специального валидатора? - PullRequest
2 голосов
/ 26 мая 2011

У меня есть небольшое веб-приложение для библиотеки с настроенным валидатором 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);
}

Когда я нажимаю «добавить»Кнопка, книга должна быть добавлена ​​в базу данных.

Когда поле ISBN, имя или поле названия не заполнены, я получаю соответствующее сообщение об ошибке.Но когда мои поля заполнены и проверка ISBN не пройдена, он показывает сообщение об ошибке, но все равно добавляет книгу (с неправильным номером ISBN) в базу данных.

Решение, о котором я подумал: Если теги моих сообщений не пустые, он не должен добавлять книгу в базу данных.Но как я могу это проверить?

Или есть лучшее решение моей проблемы?

1 Ответ

3 голосов
/ 26 мая 2011

Неправильная обработка сообщения об ошибке валидации.Вам нужно бросить a ValidatorException с FacesMessage вместо добавления FacesMessage вручную.

Так что вместо всех этих

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

вам нужноto do

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

Это для знака JSF, что ввод неверен и, следовательно, метод действия не будет вызываться.Вам также не нужно указывать идентификатор клиента, он просто окажется в <h:message>, связанном с компонентом ввода, где запускается этот валидатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...