如何使用JSR 303(Bean验证)?

时间:2013-01-28 12:11:50

标签: java bean-validation hibernate-validator

我阅读了很多关于JSR 303规范的教程,但我没有看到任何准备好生产的例子。到处都描述了如何获得Set<Constraintviolation<T>>个对象。

示例:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
Set<ConstraintViolation<Car>> violations = validator.validate(car);

但下一步是什么?我想通知方法调用者(客户端)方法参数处于不一致状态。

我必须对Set<ConstraintViolation<Car>>做些什么?我需要手动迭代Set<ConstraintViolation>,将所有错误消息收集到一个字符串中,然后使用此消息抛出异常?

或者存在一些更方便的开箱即用方式?

或者最好在每个bean中提供validate方法?

2 个答案:

答案 0 :(得分:1)

我会提出你的第一个建议 - 迭代约束违规。您不一定要创建包含所有内容的错误消息。只是有一条错误消息说bean <bean> is not valid并将约束违规设置为异常属性可能是个好主意。

也许您需要将约束违规转换为另一个对象,否则您将使您的应用程序的大部分依赖于bean验证API。这可能是一个太强大的耦合。

您的问题是,这是一个非常具体的用例,如何处理约束违规。在许多情况下,您不希望通知调用者有关约束违规的信息,而是其他一些对象。例如,在Web表单中,您希望通知视图模型它还应显示这些约束违规。抛出异常只是另一回事。请注意,在大多数情况下,这不是ConstraintViolationException,而是特定于应用程序的例外。

答案 1 :(得分:1)

这还取决于您如何使用Bean Validation。您正在描述的用例是您自己直接使用Bean Validation API。在这种情况下,您将获得验证调用结果的 Set&gt; 。你如何处理它取决于你。但是,许多技术集成了Bean Validation,并且经常隐藏对Bean Validation API的所有直接调用。例如JPA。如果您使用JPA并且Bean Validation位于类路径上,则实体将在生命周期事件(预先保留/更新/删除)上自动验证,并且如果是,则将抛出 javax.validation.ConstraintViolationException 验证错误。类似于JSF,使用Bean Validation验证表单元素会自动发生,并且还可以突出显示错误。因此,除非您想使用普通的Bean Validation API,否则您需要查看有关所选技术如何与JSR 303集成的示例。

相关问题