java - spring mvc 嵌套模型验证

标签 java spring validation spring-mvc

我有两个模型:User,Project

public class Project{
    private int id;
    @NotEmpty(message="Project Name can not be empty")
    private String name;
    private User manager;
    private User operator;
    //getter/setter omitted
}

public class User{
    private int id;
    private String name;
    //omit other properties and getter/setter
}

现在,当我创建一个新项目时,我将向 ProjectController 提交以下参数:

projects?name=jhon&manager.id=1&operator.id=2...

然后我将创建一个新的 Project 对象并将其插入到数据库中。

但是我必须验证manager和operator的id是否有效,也就是说我会验证user表中是否有匹配的id。

所以我想知道如何实现这种验证?


更新1:使用 validator

这是创建新项目的表单:

<sf:form method="${project.id==0?'post':'put'}" commandName="project" action="${context}${action}">
    Manager:<sf:input path="manager.id" />  <sf:errors path="manager.id" /> <br />
    Operator:<sf:input path="operator.id" />    <sf:errors path="operator.id" />    <br />
    Name:<sf:input path="name" />   <sf:errors path="name" />   <br />
    <input type="submit" value="Submit" />
</sf:form>


@Override
public void validate(Object obj, Errors errors) {
    User user = (User) obj;
    int id=user.getId();
    User u=userDao.query(id);
    if(u==null){
        errors.rejectValue("id", "user does not exist!");
    }
}

看来这个 validator 有效。

但是,错误信息无法在表单中显示。

然后通过调试检查结果对象,我发现了这个:

org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'project' on field 'id': rejected value [0]; codes [user does not exist!.project.id,user does not exist!.id,user does not exist!.int,user does not exist!]; arguments []; default message [null]
Field error in object 'project' on field 'id': rejected value [0]; codes [user does not exist!.project.id,user does not exist!.id,user does not exist!.int,user does not exist!]; arguments []; default message [null]

看起来结果确实有错误,但是它的路径是project.id,而在我的表单中是project.manager.id

如何修复?

最佳答案

这是一种可能的解决方案。

创建下面的类:

...
import org.springframework.validation.Validator;
...

@Component
public class ProjectValidator implements Validator {

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

    @Override
    public void validate(Object target, Errors errors) {
        Project project = (Project) target;

        /* Do your checks here */
        ...

        if (managerIdDoesNotMatch) {
            errors.rejectValue("manager.id", "your_error_code");
        }

        ...

        if (operatorIdDoesNotMatch) {
            errors.rejectValue("operator.id", "your_error_code");
        }

        ...
    }
}

然后在你的 Controller 中做类似的事情:

...
public class ProjectController {

    @Autowired
    ProjectValidator projectValidator;

    ...

    @RequestMapping(...)
    public String yourCreateMethod(..., @ModelAttribute @Valid Project project, BindingResult result) {
        projectValidator.validate(project, result);           

        if (result.hasErrors()){
          // do something
        }
        else {
          // do something else
        }
    }

}

这应该可以帮助您入门。你可以以不同的方式实例化/设置 validator ,有一个用户子 validator ,但你得到了一般的想法。

引用资料:

关于java - spring mvc 嵌套模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244639/

相关文章:

spring - 获取 java.lang.ClassNotFoundException : org. springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

java - 以 Spring MVC 形式验证整数

c# - 如何在 C# 中根据 DTD 验证 XML 文档?

java - 为什么我的 CompletableFuture 代码在 Java 8 中运行而不在 Java 11 中运行?

java - 如何添加自定义列名称Spring Data JPA?

java - 如何从 Java 中的 .dat 文件中读取一行然后需要将其分开?

java - jboss5 类加载器问题,spring 和 hibernate 尝试解析 applicationContext.xml

ASP.NET:无法验证数据

Java,Tomcat 6 : saving files to local HD

java - 重启 Android Activity 后动画不显示