我有两个模型: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/