• 版本问题


    1  参数校验 Validated

      1 在spring  2.4.1 版本中,和javax.Validation 相关的包是没有的

      2 那么在使用的时候,第一步引用,导入时就会找不到报错

        查找:javax.Validation 相关的类是在哪里:JDK?第三方jar?spring?,网上搜了一圈都是如何使用

        找了一大堆之后,找到一个资料关于jar依赖的信息,然后就尝试是否是需要使用这些依赖

        因为我并不知道这些功能时谁实现的,是依赖谁的jar,搜了都是很零碎的信息,如何使用,

        也没有去查找Validation是谁实现的,有哪些实例,在哪些框架中,在哪些jar依赖中

      3 找到接口jar包依赖,能够让类中可以导入这些相关的类,  

        尝试了很多次发现

        没有意义的,也就是不起作用,加了所有的校验都不会被执行到  

      <dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
    </dependency>

    然后发现下面的jar依赖是被我不小心注释了,拍大腿,赶紧解开注释
    4 再加入使用的jar依赖
        这时想当然的认为肯定是这个问题,肯定就有用了
       <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.0.Final</version>
    </dependency>
    5 启动项目就会报错
    Error creating bean with name 'defaultValidator' defined in class path resource
    [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]:
    Bean instantiation via factory method failed
    大体就是spring创建不了Validator对象
    6 猜测+尝试
       也就是spring的校验模块出来问题,为什么是spring的问题,而不是引入的jar,不支持spring去创建defaultValidator
       只能说是尝试,因为第三方的jar包做了尝试,再试试换个spring的版本
    7 更换spring版本到2.2.2.RELEASE
        启动项目没有问题,校验也生效了
    8 结论
        spring的2.4.1版本对于Validation参数校验是有问题的
    9 导入类找不到的原因
        去spring官网查看spring 2.4.1 和 2.2.2RELEASE 版本的相关信息,没找到原因
        看项目里2.2.2的源码,和官方都一样org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration
        这个类都是since 1.5的版本,之后都没有修改过了
    然后就找javax.validation 这些相关的类到底在哪里,jdk里没找到,spring里没找到
        在jakarta.validation-api-2.0.1.jar 找到所有需要的类和接口和注解
        补充:为什么这么难找,一开始对于类导入jar依赖的路径没有关注和理解过,以为是看到组织名,项目名,包名相关,结果是跟打包的名字无关,只和jar里面项目名称有关
        包名:可以任意定义,可以是组织名,项目名,或者自定义相关的包名,如果根据包的名字取找引入的类,包名起的和项目名关联性很差的话,可能很难找到
        项目名:这个是类存放的根目录,类的引用都是以此开始的,如果包名和项目名一致,那么根据导入的路径就很容易找到,回头看了一眼spring,发现这个结论好像不对
            spring类导入路径:组织名.项目名.目录.类名
            项目类导入路径:组织名.项目名.目录.类名
        组织名:公司的别名
        总结类导入:类导入是从calsspath 开始的,类的查找也是从calsspath开始的,classpath可以理解为项目的根目录
              至于源码的项目名,源码的物理路径,源码公司的组织名,跟java 的JVM一点关系都没有,它即不关心,也不会从那里查询
              这些名字只是给开发者,公司,使用者看的区分的,JVM不关心,它只关心项目编译后的.class文件在哪里
              至于导入的有些类带有组织名.项目名 是因为项目的目录结构定义有这些,以此开始,也在被项目编译的结构所包含,如果项目的文件目录定义这些
              但是项目编译不包含这些目录,那么导入的路径也没有它们
        结论:项目编译的根目录开始,文件存放在以下的目录结构,就是类导入的路径,至于这个路径是什么,跟组织名,项目名没有任何关系,有关系只是
           因为起了这个名字,这个也是通常的做法,也需要这样做,也就是为啥一般都这样命名的原因
              

        


  • 相关阅读:
    自省改过
    c语言学习教程1之预定义代码
    tqdm进度条管理
    React-i18next切换中英文
    React怎样实现点击其他地方隐藏弹出的菜单
    遍历对象再取值,获得新值
    Web 用户体验设计提升指南
    antd vue form
    echarts 内容显示值在图中显示,不显示交互效果,只是静态图
    element-ui中el-table根据浏览器的缩放自适应宽度
  • 原文地址:https://www.cnblogs.com/jianyi12/p/14263223.html
Copyright © 2020-2023  润新知