如何在kettle的java步骤中正确使用 map
问题描述
在kettle的java代码
步骤中使用Map<String, String>
时,如果直接调用map.get(key)后赋值给stirng对象,出现如下报错:
一个未预期的错误发生在Spoon: probable cause:在停止Spoon前,请先关闭其它spoon窗口!
org/codehaus/janino/CompileException
java.lang.NoClassDefFoundError: org/codehaus/janino/CompileException
at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClassMeta.cookClasses(UserDefinedJavaClassMeta.java:152)
at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClassMeta.checkClassCookings(UserDefinedJavaClassMeta.java:339)
at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClassMeta.getStepIOMeta(UserDefinedJavaClassMeta.java:355)
at org.pentaho.di.trans.TransPainter.drawArrow(TransPainter.java:1093)
at org.pentaho.di.trans.TransPainter.drawArrow(TransPainter.java:1033)
at org.pentaho.di.trans.TransPainter.drawLine(TransPainter.java:1005)
at org.pentaho.di.trans.TransPainter.drawHop(TransPainter.java:524)
at org.pentaho.di.trans.TransPainter.drawHop(TransPainter.java:516)
at org.pentaho.di.trans.TransPainter.drawTrans(TransPainter.java:194)
at org.pentaho.di.trans.TransPainter.buildTransformationImage(TransPainter.java:160)
at org.pentaho.di.ui.spoon.trans.TransGraph.getTransformationImage(TransGraph.java:3045)
at org.pentaho.di.ui.spoon.trans.TransGraph.paintControl(TransGraph.java:3002)
at org.pentaho.di.ui.spoon.trans.TransGraph$4.paintControl(TransGraph.java:527)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Composite.WM_PAINT(Unknown Source)
at org.eclipse.swt.widgets.Control.windowProc(Unknown Source)
at org.eclipse.swt.widgets.Canvas.windowProc(Unknown Source)
at org.eclipse.swt.widgets.Display.windowProc(Unknown Source)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1319)
at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7939)
at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9190)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:654)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92)
解决办法
在kettle中获取map中的数据内容时,需要手工强制转换为指定的类型,如下所示:
// 如何在kettle中使用 map
Map<String,String> map = new HashMap();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
// 错误
//String msg = map.get("k1");
// 正确
String msg = (String) map.get("k1");
logBasic(msg);
janino官方文档
janino官方文档中,显示使用janino时的的限制条件
如下:
Java 1.4 language features:
assert: Partially implemented - assertions are always enabled, as if the JVM was started with the "-ea" command line option
Java 5 language features:
Type arguments: Are parsed, but otherwise ignored. The most significant restriction that follows is that you must cast return values from method invocations, e.g. "(String) myMap.get(key)"
Java 7 language features:
catching and rethrowing multiple exception types: Partially implemented; parsed and unparsed, but not compilable
Type inference for generic instance creation (e.g. "Map<String, Integer> map = new HashMap<>();")
Java 8 language features:
Lambda expressions: Partially implemented; parsed and unparsed, but not compilable
Method references: Partially implemented; parsed and unparsed, but not compilable
Default methods
Repeating annotations
Type annotations
Static interface methods
Java 9 language features:
Diamond operator with inner classes
Interface private method
Modules: Partially implemented; modular compilation units are parsed and unparsed, but not compilable
Java 10 language features:
Local variable type inference: Partially implemented; parsed and unparsed, but not compilable
Java 11 language features:
Lambda parameter type inference: Partially implemented; parsed and unparsed, but not compilable
参考
http://janino-compiler.github.io/janino/