Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Validation 如何验证Springbean中的单个字段?_Validation_Spring Mvc - Fatal编程技术网

Validation 如何验证Springbean中的单个字段?

Validation 如何验证Springbean中的单个字段?,validation,spring-mvc,Validation,Spring Mvc,验证spring注释bean的首选方法似乎是使用@valid,如下面的代码块中所示,但是我希望每次显示一个字段的错误消息,仍然使用spring注释。我知道我可以在每个字段之后验证整个表单,并且只显示单个字段的消息,但这是低效的,有人知道更好的方法吗 @RequestMapping(value="/register",method=RequestMethod.POST) public @ResponseBody RegisterResponse registerSubmit(@Valid

验证spring注释bean的首选方法似乎是使用@valid,如下面的代码块中所示,但是我希望每次显示一个字段的错误消息,仍然使用spring注释。我知道我可以在每个字段之后验证整个表单,并且只显示单个字段的消息,但这是低效的,有人知道更好的方法吗

    @RequestMapping(value="/register",method=RequestMethod.POST)
public @ResponseBody RegisterResponse registerSubmit(@Valid @ModelAttribute("registerData") Register registerData, BindingResult result ){

    RegisterResponse rr= new RegisterResponse();
    if(!result.hasErrors()) {
         rr.setStatus("SUCCESS");
         rr.setResult(result);
    }
    else {
         rr.setStatus("FAIL");
         rr.setResult(result.getAllErrors());
    }
    return rr;

}
遇到第一个错误时从Validatorvalidate方法返回

为此


您需要有一个实现org.springframework.validation.Validator的自定义验证器,您可以控制按所需顺序验证字段,而,使用@Valid annotation将验证表单Bean中的所有字段,并返回所有字段的BindingResult。

我能够通过过滤掉具有空/空字段的错误来实现这一点,这确实可行,但效率有点低,因为我们验证整个Bean,即使我们关心第一个字段。我很想听到一种更好的方法来完成这种一步一步的表单字段验证。 我用了如下的方法:

    private List<ObjectError> removeEmpties(BindingResult result) {
    List<ObjectError> errors = result.getAllErrors();

    ArrayList<ObjectError> myErrors = new ArrayList<ObjectError>();

    for(ObjectError error: errors){

        FieldError realThing = (FieldError) error; 
        if (realThing.getRejectedValue()!=null && !realThing.getRejectedValue().toString().isEmpty()){
            myErrors.add(error);
        }
    }
    return myErrors;
}

您是否建议制作一个自定义验证器?我不确定我是否理解。我似乎找不到任何这样做的示例代码,我想应该有几行代码一次触发一个注释验证?为了清楚起见,我不想使用自定义验证代码,我仍然希望依赖注释,但每次只能得到一个结果。@BaradiBaradari AFAIK您不能在使用@Valid时截获验证过程。你所能做的就是从BindingResult中删除不需要的错误。试试这个:我不确定这是否有效。祝你好运!谢谢你Niranjan,我最终得到了一个有效的解决方案,尽管没有我想要的那么有效,见下面我的答案