2

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) を使用した場合にのみ、すべてのエラー メッセージが返されます。

ここで何が間違っている可能性がありますか?

4

1 に答える 1