此次升级jdk6到8的同时,还升级了tomcat,spring等版本
jdk升级
由6.X升级为1.8.0_152
- 对低版本的jar包不再支持
beanutils.copyProperties报错
当属性值为空时,抛出异常:
No value specified for 'Date'
这个异常是升级jdk之后报错,并且并不是必现的,也就是有些地方的调用会报错,有些地方则不报错.分析之后发现引入的两个jar包中均存在这个类和方法的定义,也就是存在jar包冲突.而其中一个jar包的类编译的版本为1.3,猜测是jdk版本过低,升级到jdk8之后存在不支持,导致默认的Converter类无法加载而报错. 解决方法是:升级jar包,同时排除存在依赖冲突的jar包.
spring升级
原有的版本为3.1.4.RELEASE
,升级为4.3.13.RELEASE
- quarter 系统中使用了quarter做定时任务,升级后,quarter依赖的spring的接口发生变化,需要同步升级quarter的版本为 spring升级至4.3.13.RELEASE之后,对应的quarter也要做升级 ~~~
同时升级之后,quarter配置中对应spring的api接口类不复存在,需要对配置中的类做替换.
2.
在代码中存在请求参数中多加空格的情况,在原有版本中,spring会自动忽略空格,页面可正常访问;但升级之后,请求路径中多添加的空格导致无法正常访问.
`<input type="hidden" name="actionroot" id="actionroot" value="${actionroot} ">`
修改为
`<input type="hidden" name="actionroot" id="actionroot" value="${actionroot}">`
后,页面恢复正常.
# tomcat升级至8
原有的版本为7.X,升级为8.5.23
tomcat8的校验更加严格
原来的系统在代码上存在不规范的地方,如请求url,在jsp页面中会存在`var url='${path}?param='+{param}`的情况,在升级前可正常访问页面.
但升级之后,这样不规范的写法会导致访问页面时报404错误.
# Mybatis升级
原有版本为
```aidl
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.0</version>
</dependency>
```
修改为
```aidl
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
```
上线之后,发现某个页面上显示字段为空,跟踪后发现在mapper层查询得到的数据为空,但是数据库中的数据并不为空.
仔细检查了下xml中的sql:
```
<resultMap id="..."
type="...">
<result column="LOAN_NO" property="loanNo"/>
<result column="CUST_NAME" property="custName"/>
<result column="TEL" property="tel"/>
<result column="SEX" property="sex"/>
</resultMap>
<sql id="caseInfoColumns">
a.LOAN_NO as loanNo,
a.CUST_NAME as custName,
a.TEL as tel,
a.SEX as sex
</sql>
<select id="getInboxCaseInfo" resultMap="caseInfoResultMapping">
SELECT
<include refid="caseInfoColumns"></include>
FROM YL_KX_CASE_INFO a
WHERE a.LOAN_NO = #{loanNo}
</select>
```
这个sql应该说是存在问题的,这里同时使用了resultMap和alias,反而导致字段无法匹配,但是在老版本中依旧可以正常拿到数据,有时间再看下新旧版本中的处理上的不同之处.
# 其他
此次升级顺便把系统的pom整理了下:版本定义统一放在父pom的`dependencyManagement`标签下,子pom中不再指定版本号,避免父子pom中定义版本不一致的问题
同时系统中统一引入logback的日志框架
导致了一个问题:大量页面404
由于系统中日志太少,刷新页面后,后台无任何日志,无奈只能单步DEBUG跟踪调试.发现在调用到mybatis的方法时,抛出了反射的异常,异常信息为找不到对应方法.检查后发现这个jar包没有被引进来,但在配置文件中强制使用了log4j做日志处理.
后端抛出的Throwable异常并没有被catch住,并且通过dubbo调用,传递到前端服务;
前端方法如下:
@RequestMapping(value = "/search")
public String search(Model model,MyCaseSearchConditionDto conditions,PageInfo pageInfo) {
return showPage(conditions, pageInfo, model, 1, true);
} ~~~ 这里返回的字符串不再是一个页面路径,而是一个异常信息的字符串.tomcat解析的时候当然找不到对应路径的页面,所以抛出了404错误 将配置中使用的log4j的配置删除后问题解决. ~~~
<settings>
<setting name="logImpl" value="LOG4J" />
<setting name="cacheEnabled" value="false" />
<setting name="lazyLoadingEnabled" value="false" />
<setting name="aggressiveLazyLoading" value="false" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25000" />
</settings> ~~~
总结
组件升级基本告一段落,这过程中踩了不少的坑,有些在测试阶段及时发现,有些则上线之后才反馈有问题.但这些问题大部分还是代码书写不规范造成的,所以在平时写代码的时候,规范的代码,严格的要求,可以很大程度上避免很多问题.