使用Spring验证器验证嵌套对象的列表?

Leo*_*eon 20 java validation nested list spring-mvc

我想知道如何在Spring MVC应用程序中使用Spring Validator(非注释)验证表单中的嵌套对象列表.

class MyForm() {
    String myName;
    List<TypeA> listObjects;
}
class TypeA() {
    String number;
    String value;
}
Run Code Online (Sandbox Code Playgroud)

如何创建MyFormValidator以验证listObjects并为TypeA的数量和值添加错误消息.

Ure*_*uri 23

对于嵌套验证,您可以执行以下操作:

public class MyFormValidator implements Validator {

    private TypeAValidator typeAValidator;

    @Override
    public boolean supports(Class clazz) {
        return MyForm.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        MyForm myForm = (MyForm) target;
        typeAValidator = new TypeAValidator();

        int idx = 0;
        for (TypeA item : myForm.getListObjects()) {

            errors.pushNestedPath("listObjects[" + idx + "]");
            ValidationUtils.invokeValidator(this.typeAValidator, item, errors);
            errors.popNestedPath();
            idx++;

            ...
        }

        ...
    }
}

public class TypeAValidator implements Validator{

    @Override
    public boolean supports(Class<?> clazz) {
        return TypeA.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        TypeA objTypeA = (TypeA)target;

        ValidationUtils.rejectIfEmpty(errors, "number", "number.notEmpty");
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 我会推荐这个解决方案.刚刚在我正在进行的项目中遇到了类似的问题.此解决方案允许您保持代码模块化,如果需要,将验证分成多个不同的验证器. (4认同)

Jer*_*ert 17

public class MyFormValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return MyForm.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        MyForm myForm = (MyForm) target;

        for (int i = 0; i < myForm.getListObjects().size(); i++) {
            TypeA typeA = myForm.getListObjects().get(i);

            if(typeAHasAnErrorOnNumber) {
                errors.rejectValue("listObjects[" + i + "].number", "your_error_code");
            }

            ...
        }

        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

有趣的链接:

  • 谢谢,杰罗姆.如果TypeA有自己的验证器,我如何在MyFormValidator中使用验证器?如果有多个错误,如何在表单页面上显示一条错误消息? (3认同)