当前位置: 首页 > 知识库问答 >
问题:

如何通过bean验证(JSR303)打破bean和验证器之间的耦合?

卓雅达
2023-03-14

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

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

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

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

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

有没有办法打破这种依赖循环?提供DTO jar而不依赖(或只提供bean验证API)的良好实践是什么?

谢谢

共有3个答案

廉雅惠
2023-03-14

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

邰宇
2023-03-14

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

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

袁高明
2023-03-14
  • 删除约束注释并创建普通的DTO jar
  • 将自定义约束和实现捆绑到一个单独的jar中
  • 在服务层(或者在任何需要验证的地方),添加Bean验证、Hibernate验证程序、自定义约束并使用XML配置约束

如果您最关心的是打破循环,那么您最好的选择是使用XML配置。

 类似资料:
  • 我缺少一些真正基本的东西(与EAR或EAR配置中的类加载相关)。我不明白,为什么我的JSR303验证和Hibernate验证不是从EAR内部触发的...如果我创建一个新的战争项目,它就会触发。 我正在Weblogic Server10.3上用Maven、JSF2.0、Open-JPA、EJB3.0建立一个新项目。我使用maven原型创建了所有项目。我有一个最终的EAR构建,它的结构如下: 项目名称

  • 我按照这个教程https://spring framework . guru/spring-boot-restful-API-documentation-with-swagger-2/生成了一个swagger文档。它可以工作,但是当我试图在bean中添加一些验证时,我在文档中找不到信息: 带有验证注释的我的实体: 这里,https://github.com/springfox/springfox/

  • 问题内容: 说我有以下简单的Java bean: JSR 303中是否存在一种机制来创建自定义验证器,以验证startDate必须在endDate之前的约束? 在我看来,这是一个常见的用例,但是我找不到这种多属性关系约束的任何示例。 问题答案: 我可以想到一些尝试的方法。 您可以使用适当的验证器创建类型本身的目标: 您可以将日期范围封装为一种类型,并验证以下内容: 您可以添加执行检查的简单属性:

  • 我有一个Play 2.0.1应用程序,正在通过spring data binder掌握表单处理的窍门,如文档中所述。我有一个表单,假设一个用户给另一个用户发送消息,看起来像这样: 我的自定义绑定器确保用户(由他的id以超文本标记语言-form表示)得到正确的序列化,并且当不存在这样的用户时默认为空。 我正在考虑编写额外的验证,即确保通过表单传递的用户是试图发布消息的用户的朋友。这基本上是一种-注释

  • 我们决定不使用JSR303,因为它将域对象与基础结构耦合起来,并且需要外部干预来启动验证。 但是当我们开始实现RESTendpoint时,我们再次面临验证问题,因为json转换器不使用类构造函数,而是通过反射注入值。 通过JSR303和Jersey的注释验证对象非常容易,但是需要用JSR303注释域对象。我们有一些选择: null 你对此有什么看法?将JSR303和手动验证混合在一起是一种好方法吗

  • 在Bean验证规范(JSR303和JSR349)和文档中,都没有提到@digits对Double或Float类型的支持。它只说支持以下类型: BigDecimal BigInteger CharSequence 字节、short、int、long及其各自的包装器类型