如何将 PDI 作业 variables/parameters 用于整数步长参数?
How can I use PDI job variables/parameters for integer step parameters?
我已经为 PDI 编写了一个自定义步骤插件,并且想使用作业 variables/parameters(例如通过 ${divisor}
访问)作为步骤的整数输入参数。当我尝试像使用内置插件一样进行操作时,我收到错误消息 'Unable to open dialog for this step: For input string "${divisor}"'.
我已经从官方演示步骤插件中改编了我的步骤插件,并确认如果所有步骤输入参数都被赋予硬值,该步骤通常可以正常工作。
有问题的整数参数在 Meta class 中定义为 int 并且具有适当的 getters/setters 并且例如通过其 XML 表示进行初始化。
在对话框 class 中,参数表示为文本字段,当对话框被确认并将值写入元 class 实例时,其值被解析为整数。
摘录TimeMappingMeta.java
public class TimeMappingMeta extends BaseStepMeta implements StepMetaInterface {
private int divisor;
public void loadXML(Node stepnode, List<DatabaseMeta> databases, IMetaStore metaStore) throws KettleXMLException {
setDivisor(Integer.parseInt(XMLHandler.getNodeValue(XMLHandler.getSubNode(stepnode, "divisor"))));
}
}
摘录TimeMappingDialog.java
public class TimeMappingDialog extends BaseStepDialog implements StepDialogInterface {
private Text wDivisor;
private void populateDialog() {
wDivisor.setText("" + meta.getDivisor());
}
private void ok() {
meta.setDivisor(Integer.parseInt(wDivisor.getText()));
}
}
现在的问题是作业 parameter/variable ${divisor}
的字符串可以输入到步骤参数 TimeMappingMeta.divisor
的字段中,但是对话框将在确认时失败,因为字符串无法解析为整数。该值只是在作业执行过程中替换为实际参数值,我们不能在步骤参数中保存作业参数字符串。
我错过了什么吗?甚至可以将 job variables/parameters 用于非字符串步骤参数吗?也许我可以将所有步骤参数切换为字符串,并且仅在行开始通过时在执行期间解析整数值。但是为什么kettle甚至支持非字符串步骤参数呢?
我得出结论,无法对非字符串步骤参数使用变量替换。变量的值,例如${divisor}
,即使值是逻辑整数,也只能保存为字符串。
此外,变量字符串的替换不是自动的,必须在方法 BaseStep.environmentSubstitute
中使用该值的地方显式执行。例如,在步骤的初始化中使用值如下所示:
public boolean init(StepMetaInterface smi, StepDataInterface sdi) {
TimeMappingMeta meta = (TimeMappingMeta) smi
divisor = Integer.parseInt(environmentSubstitute(meta.getDivisor()));
}
我已经为 PDI 编写了一个自定义步骤插件,并且想使用作业 variables/parameters(例如通过 ${divisor}
访问)作为步骤的整数输入参数。当我尝试像使用内置插件一样进行操作时,我收到错误消息 'Unable to open dialog for this step: For input string "${divisor}"'.
我已经从官方演示步骤插件中改编了我的步骤插件,并确认如果所有步骤输入参数都被赋予硬值,该步骤通常可以正常工作。
有问题的整数参数在 Meta class 中定义为 int 并且具有适当的 getters/setters 并且例如通过其 XML 表示进行初始化。
在对话框 class 中,参数表示为文本字段,当对话框被确认并将值写入元 class 实例时,其值被解析为整数。
摘录TimeMappingMeta.java
public class TimeMappingMeta extends BaseStepMeta implements StepMetaInterface {
private int divisor;
public void loadXML(Node stepnode, List<DatabaseMeta> databases, IMetaStore metaStore) throws KettleXMLException {
setDivisor(Integer.parseInt(XMLHandler.getNodeValue(XMLHandler.getSubNode(stepnode, "divisor"))));
}
}
摘录TimeMappingDialog.java
public class TimeMappingDialog extends BaseStepDialog implements StepDialogInterface {
private Text wDivisor;
private void populateDialog() {
wDivisor.setText("" + meta.getDivisor());
}
private void ok() {
meta.setDivisor(Integer.parseInt(wDivisor.getText()));
}
}
现在的问题是作业 parameter/variable ${divisor}
的字符串可以输入到步骤参数 TimeMappingMeta.divisor
的字段中,但是对话框将在确认时失败,因为字符串无法解析为整数。该值只是在作业执行过程中替换为实际参数值,我们不能在步骤参数中保存作业参数字符串。
我错过了什么吗?甚至可以将 job variables/parameters 用于非字符串步骤参数吗?也许我可以将所有步骤参数切换为字符串,并且仅在行开始通过时在执行期间解析整数值。但是为什么kettle甚至支持非字符串步骤参数呢?
我得出结论,无法对非字符串步骤参数使用变量替换。变量的值,例如${divisor}
,即使值是逻辑整数,也只能保存为字符串。
此外,变量字符串的替换不是自动的,必须在方法 BaseStep.environmentSubstitute
中使用该值的地方显式执行。例如,在步骤的初始化中使用值如下所示:
public boolean init(StepMetaInterface smi, StepDataInterface sdi) {
TimeMappingMeta meta = (TimeMappingMeta) smi
divisor = Integer.parseInt(environmentSubstitute(meta.getDivisor()));
}