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

4
我希望从我的应用程序中提取DTO并将它们作为jar提供给分层应用程序。
但是我使用了Bean Validation,因此DTO带有自定义约束的注释。 这些自定义注释依赖于验证实现。
@AuthorisedUser
public class UserDTO implements Serializable {
    // ...
}

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

因此,我的DTO模块依赖于注释,这些注释依赖于验证器,验证器又依赖于DAO,然后才是完整的核心应用程序。
有没有办法打破这种依赖循环? 提供DTO jar文件而不带依赖项(或仅包含bean验证API)的良好实践是什么?
谢谢。
3个回答

0
你可以提供包含DTO的JAR文件,而无需提供Bean Validation JAR文件或包含自定义约束注释的JAR文件。即使DTO类带有不存在的注释类型(当然,在这种情况下你不能使用Bean Validation),它们仍然可以被加载和使用。

我也曾这样想过,但这样做会导致循环模块依赖: DAO <-- Service(带有验证器)<--> DTO 双箭头不可行... - Thomas Duchatelle

0
  • 移除约束注解,并创建您的纯DTO jar包
  • 将自定义约束和实现打包到单独的jar包中
  • 在服务层(或任何您想要进行验证的地方),添加Bean Validation、Hibernate Validator、您的自定义约束,并使用XML配置约束

如果您最大的担忧是破坏循环,则最好使用XML配置。


“添加Bean验证”很有趣!但我不知道如何使用XML添加约束...你有相关的指导吗? - Thomas Duchatelle
http://beanvalidation.org/1.1/spec/#xml 或 http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#chapter-xml-configuration - Hardy

-1

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

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


我完全同意这个概念。但是,当我的DTO具有导入验证器类的注释(通过_@Constraint.validatedBy_)时,我无法... - Thomas Duchatelle
@Dush - 为了实现干净的分离,DTO验证器类不应该访问DAO。如果您需要验证数据相关的约束条件,例如唯一键约束,则应将其编写为服务层的一部分。DTO验证器应仅验证DTO对象。如果您可以消除DTO验证器类对DAO的依赖,则可以将DTO与验证器类一起分发。 - Nu2Overflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接