版本不匹配引发的血案:javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint

发现一个API报了错:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ‘javax.validation.constraints.NotEmpty‘ validating type ‘java.lang.String‘. Check configuration for ‘cancelReason‘
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.throwExceptionForNullValidator(ConstraintTree.java:229) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:310) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:244) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:116) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:621) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:584) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:528) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:496) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:461) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:411) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:208) ~[hibernate-validator-5.3.6.Final.jar:5.3.6.Final]
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:103) ~[spring-context-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.boot.autoconfigure.web.WebMvcValidator.validate(WebMvcValidator.java:64) ~[spring-boot-autoconfigure-1.5.13.RELEASE.jar:1.5.13.RELEASE]
    at org.springframework.validation.DataBinder.validate(DataBinder.java:895) ~[spring-context-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.validateIfApplicable(AbstractMessageConverterMethodArgumentResolver.java:270) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158) ~[spring-web-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) ~[spring-web-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:883) [spring-webmvc-4.3.17.RELEASE.jar:4.3.17.RELEASE]

一、HV000030: No validator
报这个错,一般有两种情况:
(1)约束与对象属性不匹配,譬如在String 上使用javax.validation.constraints.Future就会报这个错
(2)真的是没有相关的Validator

一下子觉得很奇怪,难道javax.validation.constraints.NotEmpty不能用在java.lang.String??

这有什么错呢!!

真的是没有Validator?

如果有,会是这样的,以javax.validation.constraints.Future为例:

还真没有!!但是@NotEmpty是有两个的
看了下线上在跑的的API,发现使用的是org.hibernate.validator.constraints.NotEmpty。
刚才也看到了,也是没有对应Validator
但是有一些与javax.validation.constraints.NotEmpty不一样的地方:使用了两个元约束@NotNull和@Size(min=1)
 

也就是一个校验不需要一个专门的Validator也是可以的?

二、ComposingConstraints【组合约束】

打断点看了下,hibernate-validator在处理约束时,使用组合约束的概念【可扩展性好强】。
具体工作流程如下:
(1)先递归校验组合约束。譬如javax.validation.constraints.NotEmpty中的@NotNull和@Size(min=1)
(2)校验主约束,如果有则校验;否则,跳过。譬如javax.validation.constraints.NotEmpty
(3)处理组合约束的校验结果。有三种策略:OR,AND,ALL_FALSE
org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree#validateConstraints(org.hibernate.validator.internal.engine.ValidationContext<T>, org.hibernate.validator.internal.engine.ValueContext<?,V>, java.util.Set<javax.validation.ConstraintViolation<T>>)

org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree#validateComposingConstraints

三、为什么会有这个一定会报错的javax.validation.constraints.NotEmpty呢?

大家都知道Spring Boot帮助我们做了一件脏活、累活【感恩】:依赖包的版本管理。难道此处有bug?
使用IDEA中的Maven Helper插件看一下:

Jump to Source,原来是pom.xml中显式引入2.0.1.Final的validator-api

Spring Boot1.5.13中使用的是1.1.0.Final

问了下当时添加此依赖的同学,反馈是从老项目中继承过来的,当时是为了解决JPA的一个问题。不过现在已经全部改用Mybatis,那么这个是可以去掉的。
把项目所有的微服务check了一遍,发现只有这个项目有。
去掉并回归了下,相关接口并没有受到影响。OK,收工

原文地址:https://www.cnblogs.com/softidea/p/12183236.html

时间: 2024-11-08 23:34:04

版本不匹配引发的血案:javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint的相关文章

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 解决方法

在使用hibernate validator进行参数有效性校验的时候,我们有时候会遇到javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint ,比如,在我们的应用中,使用了自定义注解Dict对枚举进行有效性校验,因为定义的Dict应用于String类型,例如: package com.yidoo.base.metadata.validate; import jav

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint

使用hibernate validator出现上面的错误, 需要 注意 @NotNull 和 @NotEmpty  和@NotBlank 区别 @NotEmpty 用在集合类上面@NotBlank 用在String上面@NotNull    用在基本类型上 如果在基本类型上面用NotEmpty或者NotBlank 会出现上面的错 http://blog.csdn.net/dracotianlong/article/details/23181729 javax.validation.Unexpec

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint,NotBlank判断不能为空

java 验证出现如下错误: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint错误原因      Java实体类中属性是Integer类型,用了NotBlank判断不能为空,而这个注解是判断字符串是否为空 3.解决办法 去掉@NotBlank注解.使用@NotNull————————————————版权声明:本文为CSDN博主「无名_四叶草」的原创文章,遵循

本地Host和域名不匹配引发的血案

本地Host和域名不匹配引发的血案 一.问题及原因分析: 1.页面无法加载,看控制台,发现这些do加载JS文件时找不到. 2.代码中确认对应Do加载时引用的JS路径(即域名或IP: hdm.oper.jd.com ): 3.在Host中找到对应的域名和IP的映射,删除,然后发现页面正常: 二.解决方法: 方法一:代码中直接将JS文件的引用路径改为本地: 方法二:更改Host,使加载js文件时的域名解析到一个可用的正常IP: 三.说明: 这个问题不难,只是自己缺少前台经验,不知道可在浏览器的控制台

Ubuntu版本更替所引发的“血案”

Ubuntu版本更替所引发的"血案"       今天,我兴致很高的装了双系统,并且配置了Linux的网络,接下来就是安装一些软件,来实现我想达到的功能了,结果被一个小小的命令卡的体无完肤!仔细想想还是自己对于某一些事情一知半解,或者是三天打鱼两天晒网,以前知道现在却忘了,搞得非常的被动,从下午三四点一直搞到了现在九点多,我不知道是自己的毅力支撑着,还是自己的不服输的精神和求知的欲望在坚持着,总算是让我找到了原因.      事情是这样的,当我想安装一个软件的时候,按照Ubuntu固有

javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.Integer

[java] view plaincopyprint? Apr 8, 2014 2:13:57 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet springmvc threw exception javax.validation.UnexpectedTypeException: No validator could be found for type: ja

spring boot中使用javax.validation以及org.hibernate.validator校验入参

这里springboot用的版本是:<version>2.1.1.RELEASE</version> 自带了hibernate.validator,所以不用添加额外依赖 1.创建个对应前台form的测试vo,并添加字段校验注解 import java.math.BigDecimal; import java.util.Date; import java.util.List; import javax.validation.constraints.AssertTrue; import

spring cloud 与spring boot 版本不匹配引发的问题总结

为了将前期项目慢慢转移到微服务上,今天开始搭建eureka服务时,出现以下错误: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat at org.springfra

正则匹配引发的血案

引子:一家商业IT服务公司,提供给客户的服务突然中断了将近一个小时,事后排查原因,竟然是因为一个正则表达式引起的,小小的正则表达式何以引起如此严重的问题? 事情的原因是由于正则解析导致cpu资源消耗殆尽,引起连锁反应,后续的服务都无法对外提供.引起故障的正则表达式是这样的,“(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|