spring mvc嵌套模型验证 [英] spring mvc nested model validation

查看:204
本文介绍了spring mvc嵌套模型验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两种模式:用户,项目

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提交以下参数:

Now, when I create a new Project, I will submit the following parameters to ProjectController:

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

然后我将创建一个新的Project对象并将其插入db。

Then I will create a new Project object and insert it to db.

但是我必须验证管理器的ID和运算符是否有效,也就是说如果用户表中有匹配的id,我将验证它。

However I have to validate the id of the manager and operator is valid,that's to say I will validate that if there is matched id in the user table.

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

So I want to know how to implement this kind of validation?

update1:​​using validator

update1:using validator

这是创建新项目的表格:

This is the form for create new project:

<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!");
    }
}

看来此验证器有效。

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

However,the error message can not be displayed in the form.

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

Then though debug I inspect the result object and I found this:

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

It seems that the result does have errors,but it's path is project.id while in my form it is project.manager.id

如何修复?

推荐答案

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

Here's one possible solution.

创建以下课程:

...
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");
        }

        ...
    }
}

在您的控制器中执行以下操作:

And in your controller do something like :

...
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
        }
    }

}

这应该可以帮到你。你可以用不同的方式实例化/设置验证器,拥有一个用户子验证器,但你可以得到一般的想法。

This should get you started. You could instantiate/set the validator differently, have a a user sub-validator, but you get the general idea.

参考文献:

  • Latest Spring validation documentation
  • This Stack Overflow post about how to perform validation

这篇关于spring mvc嵌套模型验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆