Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MethodArgumentNotValidException的验证程序仅处理相同类型的约束_Java_Spring_Validation_Spring Mvc - Fatal编程技术网

Java MethodArgumentNotValidException的验证程序仅处理相同类型的约束

Java MethodArgumentNotValidException的验证程序仅处理相同类型的约束,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,我试图根据bean上设置的约束验证我的表单。我使用的SpringMVC版本是3.2.4。问题是,默认的Spring验证器不能验证所有约束;只有同一类型的 我有以下控制器代码: @Controller @SessionAttributes() public class FormSubmitController { @RequestMapping(value = "/saveForm", method = RequestMethod.POST) @ResponseBody

我试图根据bean上设置的约束验证我的表单。我使用的SpringMVC版本是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;
    }
}
@ControllerAdvice
公共类FormExceptionController{
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_请求)
@应答器
公共模型映射handleMethodArgumentNotValidException(MethodArgumentNotValidException错误){
列表错误=error.getBindingResult().getFieldErrors();
ModelMap=newmodelmap();
ModelMap errorMap=新建ModelMap();
addAttribute(“hasErrors”,true);
用于(FieldError FieldError:errors){
errorMap.addAttribute(fieldError.getField(),fieldError.getDefaultMessage());
}
addAttribute(“bindingErrors”,errorMap);
返回图;
}
}
因此,空表单会导致前两条错误消息。 填写表单的前两个属性将导致第三个和第四个错误消息

只有当我对bean上的所有属性使用相同的约束类型(即NotNull)时,它才会返回所有错误消息


这里可能有什么问题?

验证程序没有问题,默认情况下接受null为有效。因此,您实际上需要两个注释(@NotNull和@Pattern/@Size)。这些注释仅触发非空值的验证,这些验证并不意味着
@NotNull
值无效,而这正是
@NotNull
的目的

这是假设您正在使用hibernate validator(因为它是现成的受支持的验证器)