Bean に設定された制約に対してフォームを検証しようとしています。私が使用しているSpring-MVCのバージョンは3.2.4です。問題は、デフォルトの Spring バリデーターがすべての制約を検証しないことです。同じタイプのもののみ。
次のコントローラーコードがあります。
@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;
}
}
および次の Bean:
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;
}
}
したがって、フォームが空の場合、最初の 2 つのエラー メッセージが表示されます。フォーム入力の最初の 2 つのプロパティは、3 番目と 4 番目のエラー メッセージになります。
Bean のすべてのプロパティに同じ制約タイプ (つまり、NotNull) を使用した場合にのみ、すべてのエラー メッセージが返されます。
ここで何が間違っている可能性がありますか?