如何在Spring MVC中验证域对象上的对象字段?

时间:2012-04-05 18:08:53

标签: java validation spring-mvc annotations

我有一个对象Foo,其中包含对象Bar的引用,该引用具有对象Baz的引用,并且为了使Foo有效,{{ 1}}必须具有对Bar的有效非空引用。

问题是Baz 要求有效的非空Bar有效,所以我不能简单地将验证放在那里,我需要它在Baz内。

这是我正在谈论的类结构的简单伪版本:

Foo

我知道我可以使用类级自定义验证注释来做到这一点,但问题是那些错误对象和相应的消息适用于类实例而不是字段实例,我需要能够轻松地显示错误正确的表单字段旁边的消息。

有没有一种好的方法可以做到这一点,还是我坚持在控制器中实现这种验证?

1 个答案:

答案 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";
    }
}