如何将 javax.validation 导入我的 Java SE 项目?

Posted

技术标签:

【中文标题】如何将 javax.validation 导入我的 Java SE 项目?【英文标题】:How do I import javax.validation into my Java SE project? 【发布时间】:2022-01-11 23:00:00 【问题描述】:

我正在尝试添加约束检查,如此处所述How to specify the cardinality of a @OneToMany in EclipseLink/JPA

【问题讨论】:

【参考方案1】:

这是我正在使用的依赖项(使用 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>

【讨论】:

查看other answer 了解最新的Bean Validation 1.1 版本更新。【参考方案2】:

截至 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>

【讨论】:

网址已损坏 - docs.jboss.org/hibernate/stable/validator/reference/en-US/…【参考方案3】:

Hibernate以外的替代解决方案

概述

javax.validation (validation-api) 是遵循JSR 380 Java Bean Validation Specification 的验证规则。验证规则需要validator 才能根据验证规则执行验证。

还有各种验证器,如hibernate(最流行的)、Bval等。

Bval

Bval 是一个替代解决方案,我认为除了Hibernate 之外它也很酷。在这里你可以按照我的替代解决方案:

MVN

        <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();
    

你去吧!!!。 同样,验证器,它只是一个验证器,您可以在其中轻松切换到其他验证器。

正反

它不是那么受欢迎,但你会喜欢的。

【讨论】:

【参考方案4】:

仅对于 Maven 项目,需要将此依赖项用于验证注释:

   <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.16.Final</version>
    </dependency>

【讨论】:

以上是关于如何将 javax.validation 导入我的 Java SE 项目?的主要内容,如果未能解决你的问题,请参考以下文章

JBoss - 如何在 jboss-deployment-structure 中排除 javax.validation?

如何在子类中覆盖@annotations (javax.validation)

javax.validation.constraints 中的注释不起作用

JPA 2.0:在 JPA 2.0 中使用 javax.validation.* 包的例外情况

javax.validation.ConstraintViolationException

错误 javax.validation.ConstraintViolationException