您的位置:首页 > 其它

Unitils(DBUnit)预置数据无法插入CLOB类型的问题

2017-12-12 20:46 295 查看
unitils版本:2.4

jdbc版本:ojdbc6.11.2.0.3.0

问题现象

通过@DataSet注解预置数据库数据时,其中一列为CLOB类型,执行用例报如下错误:



问题解决流水账

这个Unitils我是头一次用,补充项目UT刚好碰上了这个问题,懒得细细看代码,以下为(撞大运)解决过程。

步骤一

并没有什么头绪,debug进来看代码确实要报此异常,因为在CLOB.java中会将外部传入的Connection对象强转为oracle.jdbc.OracleConnection。

步骤二

初步使用“dbunit clob”作为关键字google下,发现靠谱的回答集中在配置DataTypeFactory上,但是又没人写出具体如何配置,项目工程中已有的unitils

.properties中并没有搜到类似配置。将jar包反编译后全局搜索,在 xxx 类中找到读取的配置项名字的具体逻辑,然后发现jar包带了默认配置文件(坑爹白找了半天,此处浪费15分钟)

解析此配置的代码以及配置项的key值:





在unitils的jar包中发现unitils-default.properties,里面有配置样例(自己工程的配置文件没有这部分…)





步骤三

将上面部分拷到自己的配置文件中,并没有什么鸟用…再次debug代码发现默认走的和配置后的获取到的都是OracleDataTypeFactory,一样的,两个配置文件是相互覆盖的关系,拷过来跟没改一样。

步骤四

google有人说应该使用Oracle10DataTypeFactory,修改后果然成功了。比较二者对于CLOB的区别如下:





由此可见,使用OracleDataTypeFactory根据数据库表类型会创建OracleClobDataType,必然走到强制类型转换抛异常的代码。

而Oracle10DataTypeFactory将CLOB作为StringDataType处理,因此就绕开了强制转型的代码。

问题解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unitils dbunit clob