gpt4 book ai didi

java - Kettle 步骤中的 ClassCastException

转载 作者:行者123 更新时间:2023-11-29 05:12:56 26 4
gpt4 key购买 nike

我有一个使用名为 Geometry 的自定义数据类型的 Kettle 步骤。我有以下代码行从第一行获取元信息:

geometryInterface = data.prevRowMeta.getValueMeta(meta.getGeomSelectedCol());

然后执行以下操作以获取几何值:

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 在 data-integration/lib 中)并且还由插件类加载(如果 JAR 在插件的 lib/文件夹中),则可能发生后一种情况。插件类将在插件的类加载器中找到它,其他消费者将在父类加载器中找到 ValueMetaGeometry 类。

我需要更多地了解您的转换和步骤以帮助解决问题,但一种可能的解决方案是使用 PluginRegistry 获取您的 ValueMetaGeometry 类并将您的线程上下文类加载器设置为 ValueMetaGeometry.class.getClassLoader ().您也可以使用反射来调用 ValueMetaGeometry 对象上的方法。

请注意,通常是引入此类问题的脚本步骤。我的建议是创建在内部使用 ValueMetaGeometry 方法但生成其他核心 Kettle 数据类型(如 String、Integer 等)的步骤插件。例如,我有一个 ValueMetaMap 类型以及用于映射字段和映射到字段的步骤插件:

https://github.com/mattyb149/pdi-valuemeta-map

这些步骤将 ValueMetaMap 类的使用黑盒化到可以与其“对话”的插件。

关于java - Kettle 步骤中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27694920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com