如何使用Bean Validation(JSR303)来中断bean和验证器之间的耦合?

时间:2014-02-17 17:57:48

标签: java validation bean-validation hibernate-validator

我想从我的应用程序中提取DTO,将它们作为jar提供给层级应用程序。

但我使用了Bean Validation,因此DTO使用自定义约束进行注释。 此自定义注释对验证实现具有依赖性(链接)。

@AuthorisedUser
public class UserDTO implements Serializable {
    // ...
}

@Constraint(validatedBy = { AuthorisedUserValidator.class })
public @interface AuthorisedUser { ... }

因此,我的DTO模块依赖于注释,这取决于Validator,它取决于DAO,然后是完整的核心应用程序。

有没有办法打破这种依赖周期? 提供没有依赖关系的DTO jar(或者只提供给bean验证API)的好方法是什么?

由于

3 个答案:

答案 0 :(得分:0)

一般依赖规则应该是这样的。   域对象和DTO不应该依赖于任何其他模块。   然后DAO来了。它们应仅依赖于域对象/ DTO。   然后是Service层,它取决于DAO层。这是您编写与数据库相关的验证的地方。   现在UI层使用Service API,在UI层上,您通常运行UI验证。

在您的特定情况下,AuthorisedUserValidator类应仅验证DTO classe。

答案 1 :(得分:0)

您可以在不提供Bean Validation JAR或包含自定义约束注释的JAR的情况下为您的DTO提供JAR。如果使用不存在类型的注释注释DTO类,它们仍然可以加载和使用(当然,在这种情况下你不能使用Bean验证)。

答案 2 :(得分:0)

  • 删除约束注释并创建普通DTO jar
  • 将自定义约束和实现捆绑到一个单独的jar
  • 在服务层(或者您希望进行验证的地方),添加Bean Validation,Hibernate Validator,您自定义约束并使用XML来配置约束

如果您最关心的是打破周期,最好的办法是使用XML配置。