请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

测试异常

异常信息
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0’: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/validation/ClockProvider

代码如下
@RequestMapping("/validate.json")
@ResponseBody
public JsonData validate(Car car)throws Exception{

    logger.info("validate");

    try {
        Map<String, String> map = BeanValidator.validateObject(car);
        if (map!=null&&map.entrySet().size()>0){
            for(Map.Entry entry:map.entrySet()){
                logger.info("{}->{}",entry.getKey(),entry.getValue());
            }
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return JsonData.success("hello,validation");

    }

}

public class BeanValidator {

//获取工厂类

private static ValidatorFactory vf = Validation.buildDefaultValidatorFactory();

//1.通过工厂类获取validator的实例
private static  Validator validator = vf.getValidator();


/*
* @Method Validate 单个对象的校验
*
* @param T t 需要进行校验的bean对象
*
* @param groups 分组校验;
*
* @errors 存储校验的错误信息
*
* */

public static <T> Map<String,String> validate(T t,Class... groups){


    //2.传入需要校验的bean获取validator的集合
    Set<ConstraintViolation<T>> validateResult = validator.validate(t, groups);
    //3.判断validator是否为空
    if (validateResult.isEmpty()) {
        //4.为空,则表示校验成功,返回空集合
       return Collections.emptyMap();
        //5.不为空,则表示有错误
    }else {

        //6.创建Errors集合
        LinkedHashMap<String,String> errors = Maps.newLinkedHashMap();
        //7.将错误信息用迭代器遍历Iterator
        Iterator<ConstraintViolation<T>> iterator = validateResult.iterator();

        while (iterator.hasNext()){
            //遍历得到对象的每个属性
            ConstraintViolation<T> violation = iterator.next();
            //将校验的错误信息存入errors
            errors.put(violation.getPropertyPath().toString(),violation.getMessage());
        }
        return errors;
    }
}

        /*
    * @Method
    *
    * @param Collection   校验的bean集合
    *
    *@param errors.isEmpty   这里只要有错误信息就直接结束提交数据,返回错误信息到客服端;
    *
    * */

        public static Map<String,String> ValidateList(Collection<?> collection){
            //1.检查传入的参数集合非空
            Preconditions.checkNotNull(collection);
            //2.创建收集错误信息的集合
            Map errors = new HashMap();
            //3.迭代器迭代获取每一个对象
            Iterator<?> iterator = collection.iterator();

            do {
                //4.校验成功返回空集合
                if (!iterator.hasNext()){
                   return Collections.emptyMap();

                    //5.有错误,获取错误信息,并返回到错误信息集合
                }else {

                    Object validation = iterator.next();

                     errors = validate(validation,new Class[0]);
                }
                //只要errors不为空就退出循环,使用do while()的原因是至少能进行一次判定;
            }while (errors.isEmpty());

            return errors;
        }

        /*
        *@method validateObject 将上述的两种情况封装到一个方法中
        *
        * @param first   bean对象
        *
        * @param objects 分组校验;
        *
        * */

        public static Map<String,String> validateObject(Object first,Object... objects){

            if(objects!=null&&objects.length>0){
                //当传入数据类型是集合时:
              return   ValidateList(Lists.asList(first,objects));
            }else {
                //当传入时单个对象的时候
                return validate(first,new Class[0]);
            }
        }

}

正在回答

1回答

你好,这个问题在实际项目中经常会遇到,这基本上是pom里引入的maven依赖出现包冲突了,猜测是pom.xml你某些版本和课程里的不一致,然后使用的版本引入了新的依赖与其他依赖包发生冲突导致。这个可以尝试:
1、调整pom.xml引入的依赖版本和课程里的一致,应该肯定不会出现这个问题
2、使用mvn dependency:tree 这个命令查看依赖的树形结构,他可以辅助你发现冲突的包,然后选择低版本的exclude即可。
关于maven包冲突,顺便推荐一篇学习文档:https://blog.csdn.net/sun_wangdong/article/details/51852113

1 回复 有任何疑惑可以回复我~
  • 提问者 Lqs阿木 #1
    嗯  应该是  感觉是jar包出问题  导致的bean无法注入,但是您给的关于
     <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
          <groupId>org.hibernate.validator</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>6.0.13.Final</version>
        </dependency>
    的依赖版本是5.2.4  中央仓库已经没有了
    回复 有任何疑惑可以回复我~ 2019-03-28 23:58:37
  • 提问者 Lqs阿木 #2
    ok已解决
    回复 有任何疑惑可以回复我~ 2019-03-29 09:25:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信