我有一个Kettle步骤,该步骤使用称为Geometry的自定义数据类型。我有以下几行代码从第一行获取元信息:
geometryInterface = data.prevRowMeta.getValueMeta(meta.getGeomSelectedCol());
然后执行以下操作获得Geometry值:
geometry = ((ValueMetaGeometry)geometryInterface).getGeometry(r[meta.getGeomSelectedCol()]);
运行该步骤时,出现以下异常:
java.lang.ClassCastException: org.pentaho.di.core.row.value.ValueMetaGeometry cannot be cast to org.pentaho.di.core.row.value.ValueMetaGeometry
其中ValueMetaGeometry是自定义数据类型。我猜它是一个类加载器问题。您的输入相同,将不胜感激。
是的,这是一个类加载器问题。当两个不同的插件尝试加载并使用相同的类(即重复的JAR,每个插件中的一个)然后尝试相互交谈,或者两个类正在从不同的类加载器解析ValueMetaGeometry类时,可能会发生这种情况。如果将类加载到父类加载器中(例如,如果JAR位于数据集成/ lib中),并且也通过插件类加载(如果JAR位于插件的lib /文件夹中),则可能发生后一种情况。插件类将在插件的类加载器中找到它,其他使用者将在父类加载器中找到ValueMetaGeometry类。
我需要更多地了解您的转换和步骤以帮助解决问题,但是一种可能的解决方案是使用PluginRegistry来获取ValueMetaGeometry类,并将线程上下文类加载器设置为ValueMetaGeometry.class.getClassLoader()。您也可以使用反射来调用ValueMetaGeometry对象上的方法。
请注意,通常是脚本步骤引入了此类问题。我的建议是创建在内部使用ValueMetaGeometry方法的步骤插件,但会生成其他核心Kettle数据类型(例如String,Integer等)。例如,我具有ValueMetaMap类型以及用于“要映射的字段”和“映射到字段”的步骤插件:
https://github.com/mattyb149/pdi-valuemeta-map
这些步骤将ValueMetaMap类的使用黑框化为可以“讲”它的插件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句