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)
核心修改说明
- 新增导入:必须导入
OdiDataStoreNameAndType类,否则没法创建对应的对象 - 列表转换:用Groovy的
collect方法,把每个数据存储名称字符串包装成OdiDataStoreNameAndType对象,第二个参数传null表示采用默认的对象类型(如果需要指定特定类型,可传入对应的枚举值)
这样调整后,doStandardReverse就能拿到正确类型的参数,不会再报类型转换的错误啦。
内容的提问来源于stack exchange,提问作者Prajnagni
相关产品推荐
相关产品推荐

