我只是想知道Spring中的数据验证。 Spring提供两种(可能更多)验证选项。第一个选项是使用Validator接口并自己创建整个验证。第二个选项是使用注释验证(JSR 303)。
现在我真的很困惑:)我应该选择哪种验证。我需要检查收到的数据对象是否正确(通过正确的意思是所有必填字段都已填写),这可以通过JSR 303验证或我自己的验证器与“验证器实例”完成。但我还需要检查这个数据对象是否对某些数据库约束有效(验证者需要检查数据库中的某些数据,例如,是否已注册此ID的用户......)这只能由我自己完成验证
我不知道哪种方式应该是最好的。结合两者或创建我自己的验证器?
我会感谢任何建议......
更新(从评论中重新定位)
好的,我按照Ryan的例子,我认为我成功了。我创建了自己的spring Validator实现,并在此Validator I @ Autowire-d javax JSR 303实例中创建。但注射有问题。我的配置和这段代码引起了一些例外,因为spring不知道我想注入哪个Validator。所以我删除了那段代码。
最后我还删除了spring Validator实现,因为我不知道我在哪里可以获得Errors属性,这是“validate”方法中的第二个参数所必需的:)。我从服务层手动触发验证,我真的不知道,我在哪里可以获得该Error对象。
BTW好吧,我找到了另一种解决方案如何实现验证。我正在考虑通过LocalValidatorFactoryBean扩展我的验证器类。 LocalValidatorFactoryBean类实现两个Validator接口(Spring Validator + JSR 303)。但我不确定这是否是一个好方法。这种方法也需要Error对象,我不知道在哪里找到/得到。
更新 Error对象来自“BindException”。
FooObjectVO myObject = new FooObjectVO();
BindException errors = new BindException("fooObject", myObject);
答案 0 :(得分:1)
它们不是真正独立的选项 - 更像是两个可用的验证实现。由于Spring的JSR 303支持also implements its own Validator interface,所以你不必选择其中一个。您可以以最简单的方式混合和匹配实现,以完成工作。
答案 1 :(得分:0)
在这种情况下,我更愿意将两者结合起来。我喜欢尽我所能使用JSR 303验证。我用自己的验证器补充它。