不积跬步,无以至千里

系统基础组件遇到的问题


此次升级jdk6到8的同时,还升级了tomcat,spring等版本

jdk升级

由6.X升级为1.8.0_152

  1. 对低版本的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

  1. quarter 系统中使用了quarter做定时任务,升级后,quarter依赖的spring的接口发生变化,需要同步升级quarter的版本为 spring升级至4.3.13.RELEASE之后,对应的quarter也要做升级 ~~~
org.quartz-scheduler quartz 2.3.0
同时升级之后,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> ~~~

总结

组件升级基本告一段落,这过程中踩了不少的坑,有些在测试阶段及时发现,有些则上线之后才反馈有问题.但这些问题大部分还是代码书写不规范造成的,所以在平时写代码的时候,规范的代码,严格的要求,可以很大程度上避免很多问题.