公司有一套基于jspxcms的门户内容管理系统,打算做下springboot的版本升级。折腾了几天,今天总算是成功了。下面将其中将升级过程进行的改变做一些记录。
环境:jspxcms 9.5.1
目标:springboot版本从1.5.19升级到2.2.6
第一步:修改pom.xml中的boot版本
第二步:修改JPA相关
在升级过程中,这一块花的的时间最多,卡得太久。
我们找到如下java文件
此刻我们已经会发现 MyQueryDslJpaRepository就有开始报错,排查会发现QueryDslJpaRepository引起的 这个地方够坑,QueryDslJpaRepository是1.5.19的版本类名,在2.2.6下该类已经过时,
并且更名为QuerydslJpaRepository. 恰恰就是这个么个改变,导致引发了一堆如下形式的错误
No property xxx found for type xxx
为了解决这个错,把jpa的实现原理看了几次(原理值得深究,可以学到不少额)。我们注意到InfoDao这个接口有如下几个方法
public Page findAll(Specification spec, Pageable pageable);public List findAll(Specification spec, Limitable limitable);public List findAll(Iterable ids);
在系统运行过程中,你debug甚至会发现InfoDao.findAll压根就没法继续debug下去,经过反复调试,终于发现InfoDao的最终实现其实是借助MySimpleJpaRepository产生的代理类实现的
以public List findAll(Iterable ids);为例 其实最终执行的就是SimpleJpaRepository(MySimpleJpaRepository是SimpleJpaRepository的子类)的public List findAllById(Iterable ids)的方法。坑就坑在这里,方法名改成了findAllById 所以一直就出现错误 No property findAll for type Node这个错误,产生误导。于是,便将InfoDao中的public List findAll(Iterable ids);修改成 public List findAllById(Iterable ids); 相关的service类引入该InfoDao的该方法也一并修改。因为方法名引起错误的几个方法如下:
1.5.19 下 public Info findById(Integer id);
2.2.6 public Info findOne(Integer id);
1.5.19下 public void delete(Iterable extends T> entities)
2.2.6 public void deleteAll(Iterable extends T> entities)
相关的service爆红的一并做修改。
话回到第二步开始说到的QuerydslJpaRepository ,这个类已经过期怎么办呢,我们不用他,我们用QuerydslJpaPredicateExecutor代替他,这也是官方推荐的做法 ,最终如下
第三步:有些类已经不能再使用new 这种方式构建实例了,因为升级后,相关的构造方法已经设计成private域,外部无法再new ,但是提供了相关的静态方法给使用,具体涉及到的类记录如下
Sort类(使用by方法) PageRequest类(使用of方法) 还有个什么类 忘记了
另外Pageable的offset由long换成了Int
第四步升级 tomcat pom中换成9.0.33
第五步:jsp相关
org.apache.tomcat.embed tomcat-embed-jasper provided
version最好换成10以上的版本 否则idea老出现
解决警告: Failed to scan JAR[...] java.util.zip.ZipException: error in opening zip file 这个警告
总之,按照以上五个步骤,基本没啥其他大的问题了 可以顺利升级,后续有啥问题 待后续发现