在哪里实施跨实体验证?

时间:2012-04-23 10:31:10

标签: validation java-ee jpa

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

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

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

    谢谢, 塞巴斯蒂安

1 个答案:

答案 0 :(得分:1)

从意识形态的角度来看,方法1.更好。 Bean验证工作在模型级别(在模型 - 视图 - 控制器中),如果模型部分与数据库进行对话,则没有错。因此,例如,您可以创建DAO,可以由服务租用者和模型验证器使用,以避免代码重复。

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

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