2014-12-29 3 views
1

У меня есть шаг чайника, который использует настраиваемый тип данных, называемый Geometry. У меня есть следующие строки кода, которые получают метаинформацию из первого ряда:ClassCastException в чайнике Шаг

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 - это особый тип данных. Я предполагаю, что это проблема загрузчика класса. Ваши входы на том же будут оценены.

ответ

2

Да, это проблема с загрузчиком. Это может произойти, когда два разных плагина пытаются загрузить и использовать один и тот же класс (то есть дублировать JAR, по одному в каждом плагине), а затем попытаться поговорить друг с другом или если два класса разрешают класс ValueMetaGeometry из разных загрузчиков классов. Последний случай может случиться, если класс загружен в родительский загрузчик классов (если JAR находится в интеграции данных/lib, например), а также загружен классом плагина (если JAR находится в папке lib/folder плагина). Класс plugin найдет его в загрузчике классов plugin, где другой потребитель найдет класс ValueMetaGeometry в родительском загрузчике классов.

Мне нужно будет узнать больше о ваших преобразованиях и шагах, чтобы помочь устранить проблему, но одним из возможных решений является использование PluginRegistry для доступа к вашему классу ValueMetaGeometry и установка класса threadloader потока в ValueMetaGeometry.class. getClassLoader(). Также вы можете использовать методы отражения для вызова объектов ValueMetaGeometry.

Обратите внимание, что это, как правило, шаги сценариев, которые вводят этот вид проблемы. Мой совет заключается в создании шаговых плагинов, которые используют методы ValueMetaGeometry внутри, но производят другие основные типы данных Kettle (например, String, Integer и т. Д.). Например, у меня есть тип ValueMetaMap вместе со ступенчатыми плагинов для полей, чтобы Карта и Карта полей:

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

ступеньках черного ящика использование класса ValueMetaMap для плагинов, которые могут «говорить» на Это.

1

Это действительно проблема загрузчика классов. Тип данных был с основным распределением, в то время как шаг был загружен с использованием отражения. Как только я вытащил код типа данных в код шага, он работал нормально.

Смежные вопросы