【发布时间】:2022-01-11 23:00:00
【问题描述】:
我正在尝试添加约束检查,如此处所述How to specify the cardinality of a @OneToMany in EclipseLink/JPA
【问题讨论】:
标签: jpa jakarta-ee eclipselink hibernate-validator bean-validation
我正在尝试添加约束检查,如此处所述How to specify the cardinality of a @OneToMany in EclipseLink/JPA
【问题讨论】:
标签: jpa jakarta-ee eclipselink hibernate-validator bean-validation
这是我正在使用的依赖项(使用 Maven):
<dependencies>
<!-- Bean Validation API and RI -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.2.GA</version>
</dependency>
</dependencies>
你可以从这个存储库获得:
<repositories>
<repository>
<id>jboss</id>
<name>JBoss repository</name>
<url>http://repository.jboss.org/maven2</url>
</repository>
</repositories>
【讨论】:
截至 2019 年的依赖关系:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
这会传递对 Bean Validation API 的依赖,因此您不再需要这样做:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
对于其他功能、表达式语言和 CDI 支持,您可能需要添加:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.16.Final</version>
</dependency>
来源:Hibernate Validator documentation
这些都在 Maven Central Repo 中,所以你不需要添加 JBoss repo。
顺便说一句,这是我的便捷方法示例:
public static <T extends Object> void validate( T object ) throws MigrationException
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> valRes = validator.validate( object );
if( ! valRes.isEmpty() )
{
StringBuilder sb = new StringBuilder("Validation failed for: ");
if( object instanceof Origin.Wise )
sb.append( ((Origin.Wise)object).getOrigin() );
else
sb.append(object);
for( ConstraintViolation<T> fail : valRes)
{
sb.append("\n ").append( fail.getMessage() );
}
throw new IllegalArgumentException( sb.toString() );
}
}
Origin.Wise 类似于 JAXB 的 @XmlLocation Locator。
2013 年(原帖)的版本是:
<!-- BeanValidation and Hibernate Validator. -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.0.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>5.4.0.Final</version>
</dependency>
Hibernate以外的替代解决方案
javax.validation (validation-api) 是遵循JSR 380 Java Bean Validation Specification 的验证规则。验证规则需要validator 才能根据验证规则执行验证。
还有各种验证器,如hibernate(最流行的)、Bval等。
Bval 是一个替代解决方案,我认为除了Hibernate 之外它也很酷。在这里你可以按照我的替代解决方案:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.apache.bval</groupId>
<artifactId>bval-jsr</artifactId>
<version>2.0.2</version>
</dependency>
创建静态验证器
...
import javax.validation.Validation;
import javax.validation.Validator;
import org.apache.bval.jsr.ApacheValidationProvider;
...
private static final Validator validator;
static {
validator = Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory()
.getValidator();
}
你去吧!!!。
同样,验证器,它只是一个验证器,您可以在其中轻松切换到其他验证器。
它不是那么受欢迎,但你会喜欢的。
【讨论】:
仅对于 Maven 项目,需要将此依赖项用于验证注释:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
【讨论】: