假设我已经定义了一些像这样的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验证?
答案 0 :(得分:0)
我已经看到optional
用于此目的。您将能够使用指定的Hibernate验证器来构建库。使用您的库的客户端将显式指定Hibernate验证程序依赖项,或者由他们选择的JSR-303兼容验证程序库。
这假设@Validated
注释未在import
语句中明确提及“休眠”包,而是使用了API。
如果未提供依赖项,这可能会导致应用程序无法构建,但这可能没问题,因为这将使客户端通过依赖项选择变得明确。
此SO answer提供了更多背景知识,而这里是Maven documentation。
另一种选择是保留您拥有的东西,如果有人想使用其他库,他们会从该库的依赖项中排除Hibernate依赖项,然后添加自己的依赖项。如果客户端只希望应用程序运行而不必考虑使用什么JSR-303依赖项,那就很好。
您选择哪种方式取决于您期望人们如何使用此库。