【问题标题】:How to use JSR 303 (Bean validation)?如何使用 JSR 303(Bean 验证)?
【发布时间】:2013-01-28 12:11:49
【问题描述】:

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

例子:

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

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

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

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

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

【问题讨论】:

    标签: java bean-validation hibernate-validator


    【解决方案1】:

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

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

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

    【讨论】:

    • Note that this won't be a ConstraintViolationException in most cases, but a application specific exception - 好的,但是这个应用程序特定的异常可能是像 BeanValidationException 这样的特殊异常,而不是像 ServiceException 这样的应用程序范围的异常? IE。最好创建另一个自定义异常(如BeanValidationException)而不是重用现有的应用程序特定异常?谢谢
    • @MyTitle 是的,我认为最好创建一个独立于 bean 验证 api 的异常。
    • 好的,谢谢。但是你对从服务层抛出这样的异常有什么看法呢?允许我的 EJB 方法具有像 throws BeanValidationException 这样的签名是好是坏。或者最好将它包装到服务层特定的异常中(但如果我扭曲它们,那么我无法实现你提到的东西:and set the constraint violations as a property on an exception,因为我的服务层异常没有这样的属性)?
    • @MyTitle 正在讨论。尝试寻找答案。如果你什么也没找到,你可以问一个更具体的问题。也许这个问题会对你有所帮助:stackoverflow.com/questions/14722579/…
    • @MyTitle 刚刚看到是您在问这个问题。所以你应该坚持那里接受的答案。
    【解决方案2】:

    这还取决于您如何使用 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 集成的示例。

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 2012-05-12
      • 2013-11-23
      • 2012-03-06
      • 2011-07-24
      • 2011-06-18
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多