问题描述
假设我已经定义了一些像这样的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楼
我已经看到用于此的optional
。
您将能够使用指定的Hibernate验证器来构建库。
使用您的库的客户端将要么明确指定Hibernate验证程序依赖项,要么选择自己选择的JSR-303兼容验证程序库。
假设@Validated
批注未在import
语句中明确提及“ hibernate”包,而是使用了API。
如果未提供依赖项,这可能会导致应用程序无法构建,但这可能没问题,因为它将使客户端通过依赖项选择变得明确。
这样的给出了更多的背景知识,这是 。
另一种方法是保留您拥有的资源,如果有人想使用其他库,则他们将从Hibernate依赖关系中排除对该库的依赖,然后添加自己的依赖。 如果客户端只希望应用程序运行而不必考虑使用什么JSR-303依赖项,那就很好。
选择哪种取决于您希望人们如何使用此库。