HV00030orghibernateconstraintLength异常

22次阅读

共计 1016 个字符,预计需要花费 3 分钟才能阅读完成。

  • bug 异常主要信息如下:

javax.validation.UnexpectedTypeException: HV00030: No validator could be found for constraint ‘org.hibernate.constraint.Length’ validating type ‘java.time.LocalDateTime’ . Check configuration for ‘inTime’

  • 如图所示:


1. 先说明一下该 bug 的由来,一个微服务 A 去调用另一个微服务 B,微服务 B 出现了上面的异常日志,而微服务 A 的异常日志如下,feign.FeignException:status 500 reading xxxhandlexx(String,xxDTO):

2. 由于被调用的 B 微服务已经有了异常日志,说明该调用已经发送到 B 微服务了,我们可以从 B 微服务的异常日志来排查异常。
3. 回到第一张图的异常日志,这里已经很清晰了,javax.validation.UnexpectedTypeException: HV00030: No validator could be found for constraint ‘org.hibernate.constraint.Length’ validating type ‘java.time.LocalDateTime’ . Check configuration for ‘inTime’,validation 参数校验的时候出现了异常,LocalDateTime 类型的变量 inTime 无法找到有 Length 的校验约束,请检查 ’inTime’ 变量的配置,这里的 inTime 是方法参数 DTO 对象的一个字段,如图所示:
这里的 @Length(max = 30) 是导致异常的主要原因,笔者起初 inTime 的变量类型是 String 类型,上面加了 @Length(max = 30) 参数校验,后来换成了 LocalDateTime,但是当时也不知道不能用 @Length(max = 30) 参数校验也忘记去掉了,这里导致方法入参的时候校验失败,抛出异常。那么为什么 @Length 注解无法用到 LocalDateTime 变量类型上呢?我们点进去看一下源码:
注释:Validate that the string is between min and max included. 可以看到只是能用于注解到 String 类型的变量。把 @Length 去掉 bug 就解决了。

  • 如果文章有误,希望指出来。
正文完
 0