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就解决了。