В Spring 4.0 отсутствуют ошибки проверки

Не уверен, что я делаю неправильно, но после того, как я отправил форму человека без какого-либо значения,
я не вижу никакой ошибки проверки в выводе html.


Когда я добавляю точку останова в контроллер, я вижу "ошибки"
Итак, это будет result.hasErrors() попытался добавить * form:errors path="*" - все еще ничего
но все равно ошибок нет на форме.

Метод Get:
Класс Person представляет собой POJO без аннотаций.

@RequestMapping(value="/person/add" , method = RequestMethod.GET)
public ModelAndView personAdd() {       
    ModelAndView modelAndView = new ModelAndView("personAdd");
    Person person = new Person();
    person.setCreationDate(new Date());
    modelAndView.addObject(person);
    return modelAndView;
}

метод публикации, чтобы сохранить нового человека

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@ModelAttribute("person") Person person,BindingResult result) {

personValidator.validate(person, result);

if (result.hasErrors()) {
    ModelAndView modelAndView = new ModelAndView("personAdd");          
    modelAndView.addObject(person);         
    return modelAndView;
} else {
    ModelAndView modelAndView = new ModelAndView("refreshParent");                      
    dao.persist(person);            
    return modelAndView;
}
}   

Человек Валидатор:

@Override
public void validate(Object target, Errors errors) {

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "personName","required.personName", "Name is required.");

Форма Person (для простоты указано только имя)

<form:form method="POST" modelAttribute="person" action="${pageContext.request.contextPath}/person/add">
<form:errors path="*" cssClass="errorblock" element="div"/>
<form:errors path="*" />
      <div class="form-group">
         <label class="control-label" for="inputError">Person Name:</label>  
        <form:input path="personName" class="form-control" placeholder="personName"/>
        <form:errors path="personName" cssClass="error" />
    </div>
<form:form>

person JavaSheriff    schedule 30.06.2014    source источник
comment
Как выглядит personValidator? Вы пытались использовать встроенную поддержку проверки Spring MVC, используя @Valid в сочетании с @ModelAttribute?   -  person geoand    schedule 30.06.2014
comment
добавил personValidator, чтобы использовать @Valid, мне нужно добавить другие аннотации к моему человеку, верно?   -  person JavaSheriff    schedule 30.06.2014
comment
Да это точно!   -  person geoand    schedule 30.06.2014
comment
Вы проверили, действительно ли ваш валидатор заполняет объект Errors?   -  person geoand    schedule 30.06.2014
comment
Да, я установил точку останова в коде, и я вижу, что он переходит в rejectIfEmptyOrWhitespace.   -  person JavaSheriff    schedule 01.07.2014
comment
А что происходит с объектом Errors? Заполняется ли он какими-либо ошибками?   -  person geoand    schedule 01.07.2014
comment
это содержимое ошибок: org.springframework.validation.BeanPropertyBindingResult: 1 ошибка Ошибка поля в объекте «человек» в поле «имя»: отклоненное значение []; коды [required.name.person.name,required.name.name,required.name.java.lang.String,required.name]; аргументы []; сообщение по умолчанию [Требуется имя поля.]   -  person JavaSheriff    schedule 01.07.2014
comment
Не могли бы вы поделиться проектом?   -  person geoand    schedule 03.07.2014


Ответы (2)


Попробуйте поставить такую ​​конфигурацию:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) {

    if (result.hasErrors()) {
        return "petForm";
    }

    // ...

}

И поместите это в свой персональный класс

@NotNull
String personName;

И не забудьте поместить в ваш Spring XML файл или такой же но в вашу java конфигурацию

<mvc:annotation-driven/>

Все это будет делать проверку

person nicearma    schedule 03.07.2014

ModelAndView modelAndView = new ModelAndView("personAdd");          

Эта строка строит новую ModelAndView, и тем самым вы отклоняете текущую модель. Вы добавляете только объект в строке, следующей за этой, но фактически уничтожаете уже доступные результаты связывания. Если вы используете эту конструкцию, перейдите в модель из BindingResults. И вам больше не нужно добавлять объект модели, так как он уже включен.

ModelAndView modelAndView = new ModelAndView("personAdd", result.getModel());          

Однако с управляемой аннотацией @Controller вам не нужно возвращать ModelAndView, в этом случае будет достаточно простого String.

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@ModelAttribute("person") Person person,BindingResult result) {

    personValidator.validate(person, result);

    if (result.hasErrors()) {
        return "personAdd";
    } else {        
        dao.persist(person);            
        return "refreshParent";
    }
}   

Это отобразит правильный вид и оставит текущую модель (содержащую ошибки) нетронутой.

Вы даже можете применить автоматическую проверку, добавив @Valid к аргументу атрибута модели и включить @InitBinder аннотированный метод.

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@Valid @ModelAttribute("person") Person person,BindingResult result) {

    if (result.hasErrors()) {
        return "personAdd";
    } else {        
        dao.persist(person);            
        return "refreshParent";
    }
}   

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.setValidator(personValidator);
}
person M. Deinum    schedule 03.07.2014
comment
Спасибо за подробный ответ, теперь все работает отлично, ошибка новичка :) - person JavaSheriff; 04.07.2014