如何在kettle的java步驟中正確使用 map(org/codehaus/janino/CompileException)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章