相关文章推荐
骑白马的毛衣  ·  React ...·  7 月前    · 
帅呆的毛衣  ·  visual studio ...·  1 年前    · 

今天在使用 Knife4j 调用后端接口,报出如下错误:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Long'. Check configuration for 'id'
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getExceptionForNullValidator(ConstraintTree.java:116)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:162)
	at org.hibernate.validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints(SimpleConstraintTree.java:54)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:75)
	at org.hibernate.validator.internal.metadata.core.MetaConstraint.doValidateConstraint(MetaConstraint.java:130)
	at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:123)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:555)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:518)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:488)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:450)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:400)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:172)
	at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:109)
	at org.springframework.boot.autoconfigure.validation.ValidatorAdapter.validate(ValidatorAdapter.java:65)
	at org.springframework.validation.DataBinder.validate(DataBinder.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.validateIfApplicable(AbstractMessageConverterMethodArgumentResolver.java:245)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:137)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
	......

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Long'. Check configuration for 'id'

2. 分析问题

正赶上最近ChatGPT很火,于是借助ChatGPT来解决我的问题,如下所示:

This means that the constraint “NotBlank” is not valid for a Long type value in the field “id”. A Long type cannot support the NotBlank constraint. You should either remove the NotBlank annotation or use another type such as a String.

芭比Q的是ChatGPT是英文解释,我们不妨翻译成中文,如下所示:

这意味着约束“NotBlank”对于字段“id”中的长整型类型值无效。Long 类型不能支持 NotBlank 约束。应删除NotBlank注解或使用其他类型(如字符串)。

从中文翻译来看,由于id的类型是长整型的,而NotBlank不能修饰长整型,如下是我的代码:

* 自定义组件id @NotBlank(message = "自定义组件id不能为空") @ApiModelProperty(name = "id", value = "自定义组件id", required = true, example = "1") private Long id;

但其给出两个解决方案:

  1. 删除NotBlank注解

  2. 使用其他数据类型(如字符串)

显然,这两种方式都无法解决我的问题。

因为id一般都是长整型,因而不能修改其类型,而又不能删除注解,因为必须限制id不能为空。

id不能为空,因而,我们可以考虑不能为空的注解,即@notNull

3. 解决问题

既然@NotBlank注解不能修饰长整型等,而@NotNull注解可以修饰长整型,因而可以进行如下修改:

* 自定义组件id @NotNull(message = "自定义组件id不能为空") @ApiModelProperty(name = "id", value = "自定义组件id", required = true, example = "1") private Long id;

重新启动服务后调用接口,即可成功访问,如下图所示:

此外,@NotBlank注解除了不能修饰长整型,也不能修饰浮点型,布尔型等。

因为@NotBlank注解只能作用在String上,不能为null。而且调用trim()后,长度必须大于0 ("test") ,即必须有实际字符。

4. 重要补充

  1. @NotNull注解

    • 不能为null

    • 可以为empty ,比如""," "

  2. @NotEmpty注解

    • 不能为null

    • 而且长度必须大于0,比如" "

    • 只能使用在字符串上

5. 其他说明

  1. 如果你对Knife4j比较感兴趣,可以参考这篇博文:全网最全的Knife4j swaggerj介绍

  2. 如果你对@NotEmpty、@NotBlank等注解感兴趣,可以参考这篇博文:@NotEmpty、@NotBlank等注解的正确使用

解决No validator could be found for constraint ‘javax.validation.constraints.NotBlank‘ validating type 解决javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Long'. Check configuration for 'id'问题,补充Knife4j介绍,@NotEmpty、@NotBlank等注解的正确使用和ChatGPT的介绍等文章。 No validator could be found for constraintjavax.validation.constraints.NotBlank’ validating typejava.lang.Integer’. Check configuration for ‘state’ Not 注解 @NotNull 不能为 null,但可以为 empty,一般用在Integer 类型的基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 对字段数
No validator could be found for constraintjavax.validation.constraints.NotBlank‘ validating type
原因是2.3.0的spring-boot-starter-web没有引入validation对应的包 查看2.3.0以前的版本,以2.2.7版本为例spring-boot-starter-web-2.2.7.RELEASE.pom: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validati.
import Validation from 'common/util/validation'; let validator = new Validation(); validator.addByValue('username',[ strategy:'isEmpty', errorMsg:'不能为空' strategy:'hasSpace', errorMsg:'不能有空格' const pwdChange = (ev)=>{ console.log(ev.target.value,md5(ev.target.value)); let msg = validator.valiOneByValue('username',ev.target.value); console.log(msg); 如果验证通过则返回undefined,否则是返回定义的文字信息
hibernate-validator-5.4.1.Final-dist.zip hibernate-validator-5.4.1.Final-dist.zip hibernate-validator-5.4.1.Final-dist.zip hibernate-validator-5.4.1.Final-dist.zip
Simple Vue验证程序Simple Vue验证程序是Vue.js 2.0的轻量级但灵活的插件,可让您验证输入字段,并显示er Simple Vue验证器Simple Vue验证程序是Vue.js 2.0的轻量级但又灵活的插件,可让您验证输入字段,并显示错误。 它会监视您的模型数据的更改,对其进行验证,然后将验证结果告知您。 它支持以下功能:完全自定义的验证规则。 跨领域验证。 异步/ ajax验证(支持加载指示器,结果缓存,去抖动的用户输入)。 验证自定义组件。 动态表格/多个
java.lang.NoClassDefFoundError: javax/validation/valueextraction/ValueExtractorDeclarationException  今天部署环境遇到这个问题,查了好长时间终于解决了; 问题原因: 由于jar包hibernate-validatorvalidation-api 不兼容。 解决方案: (1). 简单粗暴:根据需求删除不兼容的jar包,删除jar包必须在保证代码没有使用的情况下,不知道的尽量别删除; (2).解决兼容问题: 版本不兼容,就找兼容版本。  升级hibernate-validator版本:
这个错误信息表示:在尝试对类型为 java.math.BigDecimal 的值进行验证时,没有找到符合 javax.validation.constraints.NotBlank 约束条件的验证器。请检查配置中 maxPosition 的设置。 NotBlank是hibernate-validator提供的注解,主要用于对字符串的非空校验,但是BigDecimal不是字符串类型,所以无法使用NotBlank来校验. 需要使用其他校验注解或者自定义校验逻辑 解决Error starting ApplicationContext.To display the conditions report re-run your application xxx的问题 87742 解决Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of .. 71275 解决 opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]错误 多种方法解决Please specify which branch you want to merge with的错误 多种方法解决There is no tracking information for the current branch的错误