6

我阅读了许多关于 JSR 303 规范的教程,但我没有看到任何可用于生产的示例。到处都描述了如何获取Set<Constraintviolation<T>>对象。

例子:

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

但接下来呢?我想通知方法调用者(客户端)方法参数处于不一致状态。

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

还是存在一些更方便的开箱即用方式?

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

4

2 回答 2

1

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

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

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

于 2013-01-28T12:52:32.453 回答
1

它还取决于您如何使用 Bean Validation。您描述的用例是您自己直接使用 Bean Validation API。在这种情况下,您将得到一个Set>作为 validate 调用的结果。你如何处理它取决于你。但是,许多技术集成了 Bean Validation,并且经常隐藏对 Bean Validation API 的所有直接调用。例如 JPA。如果您使用 JPA 并且 Bean Validation 在类路径上,实体将在生命周期事件(pre-persist/update/delete)和javax.validation.ConstraintViolationException上自动验证在验证错误的情况下将被抛出。在 JSF 中类似,使用 Bean Validation 对表单元素的验证是自动发生的,并且错误也可以突出显示。因此,除非您想使用普通的 Bean Validation API,否则您需要寻找有关您选择的技术如何与 JSR 303 集成的示例。

于 2013-01-29T10:49:54.640 回答