Ошибки проверки Spring, не отображенные

У меня есть следующая ситуация. У меня есть блок проверки допустимости, чтобы проверить мой объект команды и установить ошибки на Ошибочном объекте, который будет отображен в моей форме. Блок проверки допустимости вызывается как ожидалось и работает хорошо, но ошибки, которые я установил на Ошибочных объектах, не отображены, когда меня передают обратно моей форме из-за ошибок проверки.

Блок проверки допустимости:

public void validate(Object obj, Errors err) {   
    MyCommand myCommand = (MyCommand) obj;   
    int index = 0;   
    for (Field field : myCommand.getFields()) {   
        if (field.isChecked()) {   
            if ((field.getValue() == null) || (field.getValue().equals(""))) {   
                err.rejectValue("fields[" + index + "].value", "errors.missing");   
            }   
        }   
        index++;   
    }   
    if (myCommand.getLimit() < 0) {   
        err.rejectValue("limit", "errors.invalid");   
    }   
}

Команда:

public class MyCommand {   
    private List<Field> fields;   
    private int limit;   

    //getters and setters   
}   

public class Field {   
    private boolean checked;   
    private String name;   
    private String value;   

    //getters and setters   
}

Форма:

    <form:form id="myForm" method="POST" action="${url}" commandName="myCommand">   
    <c:forEach items="${myCommand.fields}" var="field" varStatus="status">   
        <form:checkbox path="fields[${status.index}].checked" value="${field.checked}" />   
        <c:out value="${field.name}" />   
        <form:input path="fields[${status.index}].value" />   
        <form:errors path="fields[${status.index}].value" cssClass="error" /></td>   
        <form:hidden path="fields[${status.index}].name" />   
    </c:forEach>   
    <fmt:message key="label.limit" />    
    <form:input path="limit" />   
    <form:errors path="limit" cssClass="error" />   
</form:form>

Контроллер:

    @RequestMapping(value = REQ_MAPPING, method = RequestMethod.POST)   
    public String onSubmit(Model model, MyCommand myCommand, BindingResult result) {   
    // validate   
    myCommandValidator.validate(myCommand, result);   
    if (result.hasErrors()) {   
        model.addAttribute("myCommand", myCommand);   
        return VIEW;   
    }   

    // form is okay, do stuff and redirect   
}

Могло случиться так, что пути, которые я даю в блоке проверки допустимости и теге, не корректны? Блок проверки допустимости проверяет объект команды, содержащий список объектов, так вот почему я даю индекс в списке в объекте команды при регистрации сообщения об ошибке (например: "поля [" +index + "]". значение). Или случается так, что Ошибочный объект, содержащий ошибки, не доступен моему представлению?

Любая справка приветствуется и ценится, она могла бы дать мне подсказку или указать на меня в правильном направлении.

11
задан Art Vandelay 18 March 2010 в 08:31
поделиться

2 ответа

Строка err.rejectValue ("fields [" + index + "] .value", "errors.missing"); не будет делать того, чего вы пытаетесь достичь. Первый аргумент должен быть именем свойства вашего Command bean в полях вашего case.

Чтобы дать пользователю сообщение, вам нужно будет использовать параметризуемое сообщение в вашем файле свойств, например. myform.field.error = у вас есть ошибка в поле {0}

Итак, используйте этот метод объекта Errors:

void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage) 

Где вы передаете index в errorArgs

{ {1}}
1
ответ дан 3 December 2019 в 11:51
поделиться

Я обнаружил, в чем ваша проблема. свойство поля в объекте myCommand всегда равны нулю. Вам необходимо создать конструктор для класса MyCommand, в котором вам нужно использовать LazyList из Apache Commons или AutoPopulatingList из Spring, чтобы создать автоматически растущий список Field

В примере (с использованием AutoPopulatingList):

public class MyCommand {   
    private List<Field> fields;   
    private int limit;   

    //getters and setters
    //...
    //Constructor
    public MyCommand() {
        fields = new AutoPopulatingList<Field>(Field.class);
    } 
}
3
ответ дан 3 December 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: