hibernate [HV000030:无法为验证类型“java.lang.String”的约束“javax.validation.constraints.NotEmpty”找到验证器

zkure5ic  于 2022-12-29  发布在  Java
关注(0)|答案(9)|浏览(474)

我想强调的是,我已经搜索过这类问题,但没有找到适合我的解决方案。在我的Sping Boot Web应用程序中,当使用javax.validation.constraints包的@NotEmpty或@NotBlank注解验证bean时,我不断收到以下错误:

14:04:59,426 ERROR [org.springframework.boot.web.servlet.support.ErrorPageFilter] (default task-33) Forwarding to error page from request [/registrati
on] due to exception [HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.String'.
 Check configuration for 'username']: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation
.constraints.NotEmpty' validating type 'java.lang.String'. Check configuration for 'username'
        at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.throwExceptionForNullValidator(ConstraintTree.java:229)
        at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:310)
        at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(Constraint
Tree.java:244)

如果我使用@NotNull注解没有错误,但这不是我想要的行为,因为它允许空白字段。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
          <groupId>nz.net.ultraq.thymeleaf</groupId>
          <artifactId>thymeleaf-layout-dialect</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-batch</artifactId>
       </dependency>
       <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/net.sourceforge.nekohtml/nekohtml -->
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            <version>1.9.21</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <!-- webjars -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.webjars</groupId>
                    <artifactId>jquery</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.webjars/datatables -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>datatables</artifactId>
            <version>1.10.19</version>
            <exclusions>
                <exclusion>
                    <groupId>org.webjars</groupId>
                    <artifactId>jquery</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin -->
        </plugins>
    </build>

</project>

我看到hib验证器正在工作,因为如果我不使用任何@NotEmpty或@NotBlank注解,其他注解(如@Size)也可以正常工作。
在我的bean中,我导入了javax. validation. constraints。当启动我的JBoss时,出现了下面一行关于hib验证器的内容:

14:04:17,676 INFO  [org.hibernate.validator.internal.util.Version] (background-preinit) HV000001: Hibernate Validator 5.3.5.Final-redhat-2

这与Maven解析的hibernate-validator 6.0.11 jar的版本不同。
怎么了?可能是依赖冲突?
感谢所有能帮助我的人。

mccptt67

mccptt671#

我收到类似错误,但...Constraints.NotEmpty' validating type 'java.lang.Long'
发生这种情况是因为我在非String字段中使用@NotEmpty
我用@Size(value=1, message= "whatever")代替@NotEmpty解决了这个问题

vaqhlq81

vaqhlq812#

1.一月一日:检查注解字符序列是否不为空,以及修剪长度是否大于0。
1.***@NotNull***:检查注解值是否不为空,但它可以为空。
1.***@NotEmpty***:检查带注解的元素是否既不为null也不为空。
在使用上面的注解之前,必须考虑它是如何工作的。
进一步阅读请使用这篇文章:Read more article oneRead more article two

jdzmm42g

jdzmm42g3#

我也有同样的问题我的 * spring-boot-starter-web * 依赖项包括对 * org. hib的依赖项:hibernate-validator:5.3.6.Final *,但是我将此排除项添加到了我的POM中,现在一切都好了:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-validator</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>
ds97pgxw

ds97pgxw4#

感谢ChuckL的评论,我刚刚发现JBoss 7.1有自己的休眠验证器-5.3.5.Final-redhat-2.jar:

modules\system\layers\base\org\hibernate\validator\main

这就是为什么我在启动日志中看到的是5.3.5.Final-redhat-2版本,而不是WAR中打包的版本,它还在以下目录中包含validation-api-1. 1. 0. Final-redhat-1. jar:

modules\system\layers\base\javax\validation\api\main

您可以尝试通过在webapp的根META-INF中创建一个jboss-deployment-structure.xml文件来排除这些依赖项,并尝试使用打包在应用程序WAR/JAR中的依赖项。
无论如何,JBoss 7.1是一个JEE 7实现容器,更改JBoss附带的bean验证模块可能会导致我不想尝试的意外结果:)
干净的解决方案是将JBoss迁移到支持JEE 8的更新版本,否则继续使用过时的API。

eqoofvh9

eqoofvh95#

在pom.xml中添加较新版本修复了此错误:

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

我遇到了这个错误,因为我直接使用了另一个版本的验证器API,如下所示:

<dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
        <scope>compile</scope>
    </dependency>
mklgxw1f

mklgxw1f6#

您的休眠验证器实现的是Java Bean Validation 1.1规范,但@NotBlank来自Java Bean Validation 2.0。因此,您有三个选项:
1.升级Hibernate验证器,使其实现Java Bean Validation 2.0规范
1.删除@NotBlank,因为您的Hibernate验证器版本不支持它。
1.删除Hibernate验证器并丢失bean验证特性,但是这个错误将消失。

ulydmbyx

ulydmbyx7#

将@NotEmpty从org. hib.validator.constraints.NotEmpty中导入;

csbfibhn

csbfibhn8#

此错误意味着您正在尝试验证某个类型的属性,而不是为该属性创建注解的类型
例如,我在尝试验证带有NotBlank注解的枚举时遇到以下错误

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'com.example.irrigation.dtos.TimeSlot'. Check configuration for 'timeSlot'

所以,@NotBlank,@NotEmpty是用来验证字符串的,它们不能用于枚举。
如果尝试混合数据类型(例如,@NotBlank的枚举等),则将引发UnexpectedTypeException。

tyg4sfes

tyg4sfes9#

只需使用@NotNull即可

相关问题