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



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

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

@AuthorisedUser
public class UserDTO implements Serializable {
    // ...
}
@Constraint(validatedBy = { AuthorisedUserValidator.class })
public @interface AuthorisedUser { ... }

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

有没有办法打破这种依赖循环?提供没有依赖项的 DTO jar(或仅提供 Bean 验证 API)的良好做法是什么?

谢谢

  • 删除约束注释并创建普通 DTO jar
  • 自定义约束和实现捆绑到一个单独的 jar 中
  • 在服务层(或您想要进行验证的任何位置)中,添加 Bean 验证、休眠验证器、自定义约束并使用 XML 配置约束

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

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

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

在您的特定情况下,授权用户验证器类应仅验证 DTO 类。

最新更新