2013-09-04 4 views
1

Я пытаюсь проверить свою форму на ограничениях, установленных на моем компоненте. Версия Spring-MVC, которую я использую, - 3.2.4. Проблема заключается в том, что валидатор Spring по умолчанию не проверяет все ограничения; только те, которые одного типа.Validator for MethodArgumentNotValidException обрабатывает только ограничение того же типа

У меня есть следующий код контроллера:

@Controller 
@SessionAttributes() 
public class FormSubmitController { 

    @RequestMapping(value = "/saveForm", method = RequestMethod.POST) 
    @ResponseBody 
    public ModelMap saveForm(@Valid @RequestBody Form form, HttpSession session) { 
     session.setAttribute("form", form); 
     ModelMap map = new ModelMap(); 
     map.addAttribute("hasErrors", false); 
     return map; 
    } 
} 

и следующий компонент:

public class Form implements IForm, Serializable { 

    @NotNull(message = "Category should not be empty") 
    protected String category; 
    @NotNull(message = "Sub-Category should not be empty") 
    protected String subCategory; 

    @Size(min=0, message="Firstname should not be empty") 
    protected String firstName; 
    @Size(min=0, message="Lastname should not be empty") 
    protected String lastName; 

    @Pattern(regexp="^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d$",  message="Date of birth should be in dd-mm-jjjj format") 
    protected String dateOfBirth; 

    //getters and setters 
} 

Обработчик MethodArgumentNotValidException выглядит следующим образом:

@ControllerAdvice 
public class FormExceptionController { 

    @ExceptionHandler(MethodArgumentNotValidException.class) 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    @ResponseBody 
    public ModelMap  handleMethodArgumentNotValidException(MethodArgumentNotValidException error) { 
     List<FieldError> errors = error.getBindingResult().getFieldErrors(); 
     ModelMap map = new ModelMap(); 
     ModelMap errorMap = new ModelMap(); 
     map.addAttribute("hasErrors", true); 
     for (FieldError fieldError : errors) { 
      errorMap.addAttribute(fieldError.getField(), fieldError.getDefaultMessage()); 
     } 
     map.addAttribute("bindingErrors", errorMap); 
     return map; 
    } 
} 

Таким образом, пустая форма приводит к появлению первых двух сообщений об ошибках. Сочетание двух свойств формы заполняет третье и четвертое сообщения об ошибках.

Только когда я использую тот же тип contraint (т. Е. NotNull) для всех свойств моего компонента, он вернет все сообщения об ошибках.

Что может быть неправильным здесь?

ответ

0

Ничего страшного валидатора для @Size и @Pattern по умолчанию принять null как действительный. Поэтому вам понадобятся обе аннотации (@NotNull и @ Pattern/@ Size). Эти аннотации только инициируют проверку значений, которые не равны нулю, эти проверки не означают, что значения null недействительны, для которых используется @NotNull.

Предполагается, что вы используете hibernate-vaildator (так как это поддерживаемый валидатор).

Смежные вопросы