3

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

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

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

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

谢谢,塞巴斯蒂安

4

1 回答 1

1

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

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

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

于 2012-04-23T12:31:35.003 回答