如何避免与放在不同模块中的spring验证冲突?

时间:2019-02-13 15:34:16

标签: java spring maven spring-boot spring-validator

假设我已经定义了一些像这样的bean:

@Component
@Validated
public class MyComponent {
    public void someMethod(@NotNull Integer myIntValue) {
        System.out.println(myIntValue);
    }
}

这被打包到一些jar文件中,例如:com.comppany:component:1.0.jar

此jar文件需要依赖于(包括?):

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.1.0.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.0.13.Final</version>
  </dependency>

问题是:如果将此jar文件作为依赖项添加到另一个JSR-303不同的项目中,该怎么办? 验证实现(例如,来自Apache的通用验证器)?有什么办法可以避免这种情况?     1.对“组件”模块使用一个验证提示,对其他组件使用另一个验证提示吗?     2.还是可以在编译时进行验证(如何?),那么导入“组件”模块的目标具有相同的JSR-303验证?

1 个答案:

答案 0 :(得分:0)

我已经看到optional用于此目的。您将能够使用指定的Hibernate验证器来构建库。使用您的库的客户端将显式指定Hibernate验证程序依赖项,或者由他们选择的JSR-303兼容验证程序库。

这假设@Validated注释未在import语句中明确提及“休眠”包,而是使用了API。

如果未提供依赖项,这可能会导致应用程序无法构建,但这可能没问题,因为这将使客户端通过依赖项选择变得明确。

SO answer提供了更多背景知识,而这里是Maven documentation

另一种选择是保留您拥有的东西,如果有人想使用其他库,他们会从该库的依赖项中排除Hibernate依赖项,然后添加自己的依赖项。如果客户端只希望应用程序运行而不必考虑使用什么JSR-303依赖项,那就很好。

您选择哪种方式取决于您期望人们如何使用此库。