Spring Forms - Как проверить наличие ошибок на определенном пути - PullRequest
19 голосов
/ 31 октября 2009

Я использую библиотеку Spring Form для обработки страницы поиска в моем приложении. Вот отрывок из моего DD, показывающий конфигурацию бина:

<bean name="/search.html" class="myapp.web.AccountSearchController">
        <property name="sessionForm" value="true"/>
        <property name="commandName" value="searchAccounts"/>
        <property name="commandClass" value="myapp.service.AccountSearch"/>
        <property name="validator">
            <bean class="myapp.service.AccountSearchValidator"/>
        </property>
        <property name="formView" value="accountSearch"/>
        <property name="successView" value="accountSearch"/>
    </bean>

Класс валидатора довольно прост:

package myapp.service;

import org.springframework.validation.Validator;
import org.springframework.validation.Errors;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class AccountSearchValidator implements Validator {

    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());

    public boolean supports(Class clazz) {
        return AccountSearch.class.equals(clazz);
    }

    public void validate(Object obj, Errors errors) {
        AccountSearch accountSearch = (AccountSearch) obj;
        if (accountSearch == null) {
            errors.rejectValue("domainName", "error.accountSearch.neither-specified", null, "Value required.");
        } else if (accountSearch.getAccountId().isEmpty() && 
                   accountSearch.getDomainName().isEmpty() ) {
            errors.rejectValue("domainName", "error.accountSearch.neither-specified", null, "Value required.");
        }
    }
}

В моем JSP моя форма отображается в виде таблицы HTML. Я хочу, чтобы специфичные для поля ошибки отображались под соответствующим полем в виде отдельной строки таблицы. Вот фрагмент кода:

            <tr>
                <td align="right" valign="top"><form:label path="domainName">Domain Name</form:label>:</td>
                <td><form:input path="domainName" size="30"/></td>
            </tr>
            <tr>
                 <td>&nbsp;</td>
                 <td><form:errors path="domainName" cssClass="error"/></td>
            </tr>

Вопрос, который у меня возникает, - как я могу сделать вывод строки ошибки обусловленным наличием ошибки? Доступен ли экземпляр Validator из моего JSP? Каким будет тест для тега c: if?

Спасибо

Ответы [ 6 ]

36 голосов
/ 02 ноября 2009

ОК, мне потребовалось несколько дней, но я понял:

    <c:set var="domainNameErrors"><form:errors path="domainName"/></c:set>
    <c:if test="${not empty domainNameErrors}">
        <tr>
             <td>&nbsp;</td>
             <td>${domainNameErrors}</td>
        </tr>
    </c:if>

Эта статья была очень полезна: http://forum.springsource.org/archive/index.php/t-51044.html

7 голосов
/ 29 марта 2010

Использование <spring:hasBindErrors name="loginPasswordForm">

4 голосов
/ 28 ноября 2013

Используйте <spring:bind path="fieldName"> и отметьте status.error, чтобы увидеть, есть ли в поле ошибка

Пример

<spring:bind path="phoneNumber">
     <form:input path="phoneNumber" />
     <form:errors path="phoneNumber" cssClass="error" />
     ${status.error ? 'has error' : ''}
</spring:bind>

Примечание

<form:input path="" /> должен быть внутри <spring:bind > тег

3 голосов
/ 22 февраля 2015

Пожалуйста, проверьте этот сегмент кода

<spring:bind path="domainName">
  <c:if test="${status.error}">
    <tr>
      <td>&nbsp;</td>
      <td><form:errors path="domainName" cssClass="error"/></td>
    </tr>
  </c:if>
</spring:bind>
2 голосов
/ 17 ноября 2015

На самом деле есть простое решение. Я нигде не видел, но мне кажется, что это самый простой.

<tr>
    <td align="right" valign="top"><form:label path="domainName">Domain Name</form:label>:</td>
    <td><form:input path="domainName" size="30"/></td>
</tr>
<form:errors path="domainName">
<tr>
    <td>&nbsp;</td>
    <td><form:errors path="domainName" cssClass="error"/></td>
</tr>
</form:errors>

Когда у тега form: errors нет тела, он отображает ошибку с помощью механизма по умолчанию, но когда у тега есть тело, он просто отображает тело, если есть ошибка для этого пути.

1 голос
/ 31 октября 2009

Я думаю эта статья описывает то, что вам нужно, в подробностях

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