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

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处理,因此就绕开了强制转型的代码。

问题解决

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值