【问题标题】:Where to implement cross-entity-validation?在哪里实施跨实体验证?
【发布时间】:2012-04-23 10:31:10
【问题描述】:

我有一个项目,其中数据模型和业务层位于两个不同的模块中。当然,业务模块依赖于模型模块。实体验证是通过 java-validation-api 注解实现的。

我想知道我应该在哪里实现跨实体验证(业务验证,验证不同实体类型之间的关系)。目前我看到以下选项:

  1. 创建自定义 javax.validation.ConstraintValidators 和相关注释。问题是,验证器需要访问业务服务,即检索相关实体,但模型模块不应该依赖于业务模块。
  2. 在业务服务持久化/合并方法中实现跨实体验证(即通过使用拦截器)。这是可能的,但跨实体验证与实体验证是分开的,我希望只有一个地方进行验证。

哪个选项更可取?有没有更好的建议?

谢谢, 塞巴斯蒂安

【问题讨论】:

    标签: validation jakarta-ee jpa


    【解决方案1】:

    从思想上看做法1.比较好。 Bean Validation 在 Model 级别(在 Model-View-Controller 中)工作,如果 Model 部分与数据库对话,这没有错。因此,例如,您可以创建 DAO,供服务领导者和模型验证者使用,以避免代码重复。

    拦截器也是验证某些东西的好地方,但您将无法使用 Bean 验证的全部功能和自动性。可能您需要手动调用模型对象上的 validate 方法,在需要的地方抛出 ConstraintViolationException 等。可行,但需要做一些工作。此外,模型中可能会留下一些验证,因此,正如您所指出的,进行验证的地方将不止一个。

    所以我会将必要的数据库代码移动到单独的层并使用选项 1。

    【讨论】:

    • 因此,如果在单独的层中不仅仅是数据访问方法,即复杂的计算,验证所需的,您更喜欢选项 2,对吗?还是其他?
    • 模型也是进行复杂计算的正确位置,所以,1. 看起来更好,如果我们想尽可能地坚持 MVC。显然,如果这些计算是在服务层中完成的,并且使用选项 2 将它们移到其他地方是没有意义的。会更好。
    猜你喜欢
    • 2021-07-19
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2015-12-18
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多