如何在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/