软硬件环境:kettle6.1/windows7/                          时间:2016/8/11


问题描述

使用[利用Janino计算Java表达式][userdefined java expression]组件来设计Transformer时报错,错误信息如下:

org.codehaus.janino.CompileException:Line 1, Column 24: A method named "length" is not declared in anyenclosing class nor any supertype, nor through a static import

A method named"length" is not declared in any enclosing class nor any supertype,nor through a static import

数据源是这样的:

wKioL1esFaai_DzqAAAxvLI8ShM854.jpg-wh_50

1

对源数据中传来的phone_number字段进行处理,是这样写的java脚本

wKiom1esFc3gdedlAAAURGDFwGk784.png-wh_50

2

 

问题解决

  从网上找了一个类似的模型如下图3所示,执行时成功的,所以在我电脑上的kettle6.1版本时没有bug且可以调用java函数的。现在我仿照着这个模型进行改写,将列名换掉,即如上图1和图2所示,执行仍然不成功,报同样的错误

wKioL1esFd7SW_SHAAEb0HrLatU610.jpg-wh_50

3

  按理说这样的java脚本的写法是对的,从网上下载的模型也是可以实现length()函数的调用的,现在唯一存在的问题就是列的问题了。从图3可看出location列是string类型,而我的调用的列是number型的,所以我就推测可能是因为只有string类型的列才能调用length()/substring()这类的字符串函数。

  于是我将phone_number的类型改为string类型,再次执行这个脚本的时候就成功的执行了,至此解决问题

总结:

  既然是和java相关,那么对java就应该有相应的了解,我虽然之前在大二学过java,但是已经忘记了,而且kettle里用到的还是javajava script两个语言,对这两个就更加分不清楚了,所以现在如果想学好kettle,那么想要灵活运用,这两个应该是跑不了了,一定要学习的,至少是基本的知识。