You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ODI-SDK Groovy脚本执行选择性反向工程时遇类型转换错误

解决ODI Groovy脚本反向工程的ClassCastException问题

嘿,我来帮你搞定这个报错!你遇到的java.lang.ClassCastException: java.lang.String cannot be cast to oracle.odi.core.service.reverse.OdiDataStoreNameAndType问题,本质是调用doStandardReverse方法时传错了参数类型。

问题根源

从报错栈能看出来,ReverseService里的convertDataStoreListToSnpsStringPair方法,需要的是OdiDataStoreNameAndType对象的集合,但你直接传了普通的字符串列表["SNP_CHECK_TAB","SRC_CITY"],这就导致了类型转换失败。

修正后的完整脚本

只要把字符串列表转换成OdiDataStoreNameAndType对象的列表就行,修改后的代码如下:

import oracle.odi.domain.project.finder.IOdiProjectFinder
import oracle.odi.domain.model.finder.IOdiDataStoreFinder
import oracle.odi.domain.model.finder.IOdiModelFinder
import oracle.odi.domain.model.OdiModel
import oracle.odi.domain.model.OdiModelFolder
import oracle.odi.domain.model.OdiModel.ReverseObjectType
import oracle.odi.domain.project.finder.IOdiFolderFinder
import oracle.odi.domain.project.finder.IOdiUserProcedureFinder
import oracle.odi.domain.project.finder.IOdiKMFinder
import oracle.odi.domain.mapping.finder.IMappingFinder
import oracle.odi.domain.adapter.project.IKnowledgeModule.ProcessingType
import oracle.odi.domain.topology.finder.IOdiContextFinder
import oracle.odi.domain.topology.finder.IOdiLogicalSchemaFinder
import oracle.odi.domain.topology.finder.IOdiTechnologyFinder
import oracle.odi.domain.topology.OdiContext
import oracle.odi.domain.topology.OdiTechnology
import oracle.odi.domain.topology.OdiLogicalSchema
import oracle.odi.domain.model.OdiDataStore
import oracle.odi.domain.xrefs.expression.Expression
import oracle.odi.domain.xrefs.expression.Expression.SqlGroupType
import oracle.odi.domain.project.OdiProcedureLine.LogCounter
import oracle.odi.domain.project.OdiProcedureLineCmd
import oracle.odi.domain.project.OdiUserProcedure
import oracle.odi.domain.project.OdiUserProcedureLine
import oracle.odi.domain.project.OdiPackage
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition
import oracle.odi.core.service.reverse.ReverseService
import oracle.odi.core.service.reverse.OdiDataStoreNameAndType // 新增这个导入
import oracle.odi.domain.project.StepModel.ReverseModel

txnDef = new DefaultTransactionDefinition()
tm = odiInstance.getTransactionManager()
tme = odiInstance.getTransactionalEntityManager()
txnStatus = tm.getTransaction(txnDef)

// 把字符串转成方法需要的OdiDataStoreNameAndType对象
def myList = ["SNP_CHECK_TAB","SRC_CITY"].collect { 
    new OdiDataStoreNameAndType(it, null) 
}

OdiModel srcModel = ((IOdiModelFinder)tme.getFinder(OdiModel.class)).findByCode("TEST_MOD");
// 执行反向工程
rs = new ReverseService();
rm = rs.doStandardReverse(odiInstance, srcModel.getModelId(), ReverseService.DataStoreSelection.SELECTED, myList);
println('Data Store/s created.');
tm.commit(txnStatus)

核心修改说明

  1. 新增导入:必须导入OdiDataStoreNameAndType类,否则没法创建对应的对象
  2. 列表转换:用Groovy的collect方法,把每个数据存储名称字符串包装成OdiDataStoreNameAndType对象,第二个参数传null表示采用默认的对象类型(如果需要指定特定类型,可传入对应的枚举值)

这样调整后,doStandardReverse就能拿到正确类型的参数,不会再报类型转换的错误啦。

内容的提问来源于stack exchange,提问作者Prajnagni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:57:54