一、具体问题如下
在 jenkins 上部署Java项目时mybatis配置文件中的占位符失效(此占位符读取在apollo配置中心配置的dataSourceConfig.properties[数据源属性配置文件])。
二、出现问题的原因及解决方法
在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer进行自动扫描的时候,设置了sql sessionFactory 的话,可能会导PropertyPlaceholderConfigurer失效,也就是用${ jdbc .username}这样之类的表达式,将无法获取到properties文件里的内容。导致这一原因是因为MapperScannerConfigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当做 字符串 复制了。
但是如果不设置sqlSessionFactory属性的话,就必须要保证sessionFactory在spring中名称一定要是sqlSessionFactory,否则就无法自动注入。又或者直接定义MapperFactoryBean,再或者放弃自动代理接口方式。
2、解决方法
<bean class=”org.mybatis.spring.mapper.MapperScannerConfigurer”>
<property name=”basePackage” value=”com.test.dao” />
<property name=” sql SessionFactory” value=”sqlSessionFactory” />
</bean>
将上面配置中的
<property name=”sqlSessionFactory” value=”sqlSessionFactory” />
替换为
<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactory” />
即可。
三、总结
改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用sqlSessionFactoryBeanName注入),因为这时不会立即初始化sqlSessionFactory,传入的只是名字,非bean,所以不会引发提前初始化问题。
经测试验证 Java 项目在jenkins上部署成功,上述问题得以解决。有什么不妥之处,还望大家评论指正。