准备在工作流程的项目中加入数据校验,然后导入jar包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
加入一个实体
加一个控制层
但在实体的一个属性上写注解@NotBlank的时候,发现飘红,怎么回事?先不管再加一个正则试试,又飘红,咋回事?网上找一下原因,说是版本不兼容,说spring boot版本过高,但我不能改spring boot的版本,所以继续看其他原因,再看我spring boot版本2.3.1,于是突然又看到一个博客,说从2.3x后spring boot已经兼容了validator,于是把之前哪个左边删除了,重新把新的包导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
nice~每个校验注解都能用了,也不飘红了,就很虚浮,把控制层随便先写一个接口试试
@RestController
public class CheckTestController {
@PostMapping("/check")
public CheckTest check(@RequestBody @Valid CheckTest checkTest) {
return checkTest;
}
}
可以没报错,距离成功只有一步 ctrl+shift+f10 ,启动吧!初始化数据。。。加载工作流数据,只见代码一页一页的滚动。。。说时迟那时快,突然!一个红色的单词映入眼帘–ERROR,WDNMD!
什么原因?
报错如下:
ERROR 9944 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
javax.el.ELManager.getExpressionFactory(ELManager.java:38)
The following method did not exist:
javax.el.ELUtil.getExpressionFactory()Ljavax/el/ExpressionFactory;
The method's class, javax.el.ELUtil, is available from the following locations:
jar:file:/C:/Users/CC/.m2/repository/javax/el/el-api/2.2/el-api-2.2.jar!/javax/el/ELUtil.class
jar:file:/C:/Users/CC/.m2/repository/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar!/javax/el/ELUtil.class
The class hierarchy was loaded from the following locations:
javax.el.ELUtil: file:/C:/Users/CC/.m2/repository/javax/el/el-api/2.2/el-api-2.2.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of javax.el.ELUtil
?????这是啥?这是jar包冲突啊,el-api.jar就是个表达式的jar包依赖罢了,然鹅,一想我maven中没有引入啊
jar包冲突情况,A里已经有B了,你又引入了一次B,导致冲突,或者你单独引入了两个A
解决思路,找到两个冲突的包,把版本低的删除,因为高版本一般向下兼容,如果高版本的不行再换成低版本的
我这儿最后一步步排查,发现工作流已经中自己引入了一个包el-api-2.2.jar
而
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
中也引入了el的包,所以经过取舍,我把这个spring-boot-starter-validation依赖删除了,重新导入一个单独的校验依赖(需要注意的是该依赖的版本和spring boot 2.3x是兼容的) ↓
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.0.Final</version>
</dependency>
这个依赖只是单纯的校验依赖,所以el.jar不会有冲突
总结:开始是validator版本过低与spring boot2.3.x不兼容,之后导入spring boot validator的模板,因为该模板和工作流都分别依赖了不同版本的el.jar,导致jar包冲突,最后我把spring boot validator的模板删除解决了el.jar冲突,引入了高版本的validator和spring boot 2.3x兼容,项目成功运行~ ~ ~ ~ ~