版本管理:maven
以下介绍需要重点关注的点
一、Spring
1、spring-struts.3.0.5包是spring为struts1写的整合插件,此插件支持到struts1 EOL(end of life)的时候就没有了后续版本。升级到Spring5后我们采用了移植spring-struts插件源码的办法来解决这种尴尬。
2、修改spring配置文件的约束头
3、修改集成第三方组件(如quartz、jackson、hibernate等)的注入bean、入口类
二、必须升级的第三方组件:
1、jackson从1.8.1升级到2.9.7:jackson从1升到2后包名发生了变化,api变化也较大。但总能找到其替代api
2、quartz从1.8.5升级到2.3.0: quartz1升级2后api变化较大,部分删掉启用的api源码注释中没有link,需阅读官方文档获取信息
3、poi升级到3.16,历史版本有XXE漏洞。poi的api变化可以通过阅读源码来找出,源码注释较为规范
4、ehcache从1.2.3升级到2.10.3
三、Hibernate
Hibernate的变化比较大,主要是API的变化。部分缺失的API搜遍了国内外搜索引擎、大拿博客和知名论坛都找不到一个合适的替代方案。对于一个深度依赖ORM的老项目,平滑移植的想法从一萌生开始就断念了,只能被人逼着硬着头皮搞。
纵观Hibernate3、4、5、6。 其设计标准逐渐向Jpa靠拢,API也是这样。加上springBoot项目的火爆干扰,Spring社区也不会给出Spring5+Hibernate5的老项目升级方案。所幸的事这事总算过去了,现在回头来发发牢骚。
升级步骤:
1、修改hbm映射文件,dtd约束、主键生成策略等。需要注意blob,clob等字段的类型声明,org.springframework.orm.hibernate3.support.BlobByteArrayType和org.springframework.orm.hibernate3.support.ClobStringType在spring5中已被删掉
2、修改获取session的配置项和代码,修改通过session获取connection的方式等
3、元数据的获取方式已发生变化,org.hibernate.cfg.Configuration.getClassMapping(String)已删除。
4、Hibernate5.3+版本的hibernate对Hql占位符的使用有严格要求
5、Hibernate5.2+版本之后createCriteria()、createSQLCriteria()方法均已过时,推荐使用JPA标准API方式
6、修改和spring的集成配置项
7、ehcache升级2.10.3API变化较大,前期为了启动测试关闭了Hibernate二级缓存
8、修改其它变化了的API
四、JDK1.8+
Spring5要求使用JDK1.8+编译
升级之前项目对ssh包引用情况。
<dependencies>
...
<!-- spring start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-struts</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<!-- spring end -->
<!-- struts start -->
<dependency>
<groupId>struts</groupId>
<artifactId>struts</artifactId>
<version>1.2.9</version>
</dependency>
<!-- struts end -->
<!-- hibernate start -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.7.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.2.0.ga</version>
</dependency>
<!-- hibernate end -->
...
</dependencies>
升级后的maven配置如下:
<properties>
<springframework.version>5.1.5.RELEASE</springframework.version>
<hibernate.version>5.2.18.Final</hibernate.version>
<poi.version>3.16</poi.version>
</properties>
<dependencies>
...
<!-- spring start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-jcl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- spring end -->
<!-- struts start -->
<dependency>
<groupId>struts</groupId>
<artifactId>struts</artifactId>
<version>1.2.9</version>
</dependency>
<!-- struts end -->
<!-- hibernate start -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- hibernate end -->
...
</dependencies>
spring-jcl
spring-jcl是对common-logging的封装,包名和common-logging一致,common-logging的部分api在spring-jcl不存在,使用时会产生冲突。所以spring-webmvc包中排除了对spring-jcl的依赖传递
部分修改项记录
需改项 | 修改前 | 修改后 |
---|---|---|
Hibernate dtd约束 | http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd | http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd |
Hibernate API | Hibernate.STRING | StandardBasicTypes.STRING |
Hibernate API | org.hibernate.engine.SessionFactoryImplementor | org.hibernate.engine.spi.SessionFactoryImplementor |
Hibernate API | org.hibernate.engine.SessionImplementor | org.hibernate.engine.spi.SessionImplementor |
Hibernate API | org.hibernate.impl.SessionFactoryImpl | org.hibernate.internal.SessionFactoryImpl |
Spring API | org.springframework.orm.hibernate5.SessionFactoryUtils.getSession(sessionFactory, true) | sessionFactory.openSession() |
Ehcache API | net.sf.ehcache.constructs.web.filter.FilterServletOutputStream | |
Spring API | org.springframework.orm.hibernate3.support.HibernateDaoSupport | org.springframework.orm.hibernate5.support.HibernateDaoSupport |
Spring API | org.springframework.orm.hibernate3.LocalSessionFactoryBean | org.springframework.orm.hibernate5.LocalSessionFactoryBean |
Hibernate API | org.hibernate.collection.PersistentSortedSet | org.hibernate.collection.internal.PersistentSortedSet |
Hibernate API | org.hibernate.Session.connection() | 原API已删除,项目改用org.springframework.orm.hibernate5.SessionFactoryUtils.getDataSource(sessionFactory()).getConnection() |
或者 org.hibernate.engine.spi.SessionImplementor sessionImplementor = (org.hibernate.engine.spi.SessionImplementor) sessionFactory.getCurrentSession(); Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection(); | ||
此处需要特别注意,原来通过org.hibernate.Session获取的connection连接是可以通过session连接的关闭而关闭的,不需要特别考虑connection连接的关闭问题,改为以上2替代方案后connection连接需要显式关闭,否则会有连接泄露问题 | ||
spring配置项 | <ref local> | <ref bean> |
Hibernate API | session.setFlushMode(FlushMode.NEVER) | session.setHibernateFlushMode(FlushMode.MANUAL) |
Hibernate API | org.hibernate.Query | org.hibernate.query.Query |
Hibernate API | currentSession.get().flush() | 删除 |
还需要修改xml约束
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
改为
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>|