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文件在哪里
至于导入的有些类带有组织名.项目名 是因为项目的目录结构定义有这些,以此开始,也在被项目编译的结构所包含,如果项目的文件目录定义这些
但是项目编译不包含这些目录,那么导入的路径也没有它们
结论:项目编译的根目录开始,文件存放在以下的目录结构,就是类导入的路径,至于这个路径是什么,跟组织名,项目名没有任何关系,有关系只是
因为起了这个名字,这个也是通常的做法,也需要这样做,也就是为啥一般都这样命名的原因