1.PropertyPlaceholderConfigurer无效
昨天白天就遇到了这个问题,applicationContext里的dataSource使用PropertyPlaceholder,如<property name="driverClassName" value="${jdbc.driver}" />,然后启动spring一直报[${jdbc.driver}]无法加载,这里用到了spring 3.0的新特性profiles,起先还以为profiles设置问题,后来把profiles撤掉问题依旧。不用占位符,直接填实际值是可以的。而且就算<property name="ignoreResourceNotFound" value="false" />这样设置也不会报错,这是不应该的。以前一直用占位符方式也都没出现过问题,然后就下班了。回家玩了会儿游戏,打得爽了,心情好就想再看看这个问题。我把MyBatis有关的配置全撤掉,一个一个加上去,当加到MapperScannerConfigurer的时候就出现问题, 没加的时候properties文件不存在也会报错,那问题肯定就在这里了。用google搜了一把,官网有人说MapperScannerConfigurer会在PropertyPlaceholderConfigurer之前进行扫描,所以它或它依赖的BEAN如果有用到Placeholder的都不会被替换掉。他没有提到这也会导致ignoreResourceNotFound=false失效。。。没办法,只好将配置属性直接写在applicationContext里了,总比注入到系统变量里强吧。。。
今天又查了一下,发现这里有更好的解决方法http://www.oschina.net/question/188964_32305
2.com.ibatis.sqlmap.engine.type.BaseTypeHandler ClassNotFoundException
接下来就是这个异常了,我反复仔细查看mybatis包和mybatis-spring包,就是没找到com.ibatis.sqlmap.*包,起初以为版本问题,换mybatis-3.1.0和mybatis-spring-1.1.0,问题依旧,工程只有一个Mapper.xml,这个Mapper.xml去掉就不报错,加上就报错,当时我就陷入了泥沼,犯迷糊了。搜也搜不到解答,纠结了很久,另外创一个小工程,只引入spring和mybatis包,还是一样的问题,于是想给mybatis提个Issue, 在填写Issue列依赖包的时候我突然看spring-orm这个包非常地碍眼,于是看了一下里面的类,在org.springframework.orm.ibatis.support包下找到若干TypeHandler,其中BlobByteArrayTypeHandler是我有用到的。因为我看到它对Oracle的Blob插入会先创建一个空的Blob,得到流再往流里写实际的数据,这是ORACLE对较大BLOB的做法,而MyBatis的BlobTypeHandler没有这么做,所以我就选了它。打开BlobByteArrayTypeHandler源码,看到了真胸,在它的父类AbstractLobTypeHandler里有这个import com.ibatis.sqlmap.engine.type.BaseTypeHandler,怪我自己不仔细查看Mapper.xml了,早看到异常的BaseTypeHandler就应该想到那个BlobByteArrayTypeHandler了,不过在这里也要鄙视一下spring,都到3.1.1.RELEASE了居然还只对ibatis2支持,对hibernate倒是非常上心,hibernate4也已经支持了。果然基友只能有一个啊。。。不然菊花残得快。
3.XML fragments parsed from previous mappers does not contain value for xxx
最后一个问题就是这个了,因为以前基本没用过IBatis/MyBatis,只是写过一个小DEMO,对其Mapper.xml的语法还不怎么了解,其中有个配置
<select id="findAll" resultMap="modelResult">
<![CDATA[
select * from t_model
]]>
</select>
<select id="findById" parameterType="String" resultMap="ModelResult">
<include refid="findAll"/>
<where>
id=#{id}
</where>
</select>
就报了这个错,哈哈,没错,include的那个findAll不是一个Sql元素,所以就报错了,这是我自己2了。直接把include换成<![CDATA[
select * from t_model
]]>就好了。
搞完这些看时间已经是2点了。。。赶紧睡觉。