我有一个对象Foo
,其中包含对象Bar
的引用,该引用具有对象Baz
的引用,并且为了使Foo
有效,{{ 1}}必须具有对Bar
的有效非空引用。
问题是Baz
不要求有效的非空Bar
有效,所以我不能简单地将验证放在那里,我需要它在Baz
内。
这是我正在谈论的类结构的简单伪版本:
Foo
我知道我可以使用类级自定义验证注释来做到这一点,但问题是那些错误对象和相应的消息适用于类实例而不是字段实例,我需要能够轻松地显示错误正确的表单字段旁边的消息。
有没有一种好的方法可以做到这一点,还是我坚持在控制器中实现这种验证?
答案 0 :(得分:1)
注释很好,但在这种情况下可能不合适。问题是注释是在实际的类上标记的,这意味着你不能在同一个类上真正拥有两种类型的验证注释 - 这似乎是你的问题。使用老式的Spring MVC方法实现Spring Validator类可能更合适。这是一个例子:
public class FooValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Foo.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Foo foo = (Foo) target;
if(foo.getBar() == null) {
errors.rejectValue("bar", "bar[emptyMessage]");
}
else if(foo.getBar().getBaz() == null){
errors.rejectValue("bar.baz", "bar.baz[emptyMessage]");
}
}
}
你的Spring控制器仍然与使用注释几乎相同:
@Controller
public class FooController {
@InitBinder("foo")
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new FooValidator());
}
@RequestMapping(value="fooPage", method = RequestMethod.POST)
public String processSubmit(@Valid Foo foo, BindingResult result, ModelMap m) {
if(result.hasErrors()) {
return "fooPage";
}
...
return "successPage";
}
}