zl程序教程

您现在的位置是:首页 >  其它

当前栏目

解决No validator could be found for constraint ‘javax.validation.constraints.NotBlank‘ validating type

解决 for No be type found could validation
2023-09-14 09:07:24 时间

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等注解的正确使用