NiFi自定义处理器表达语言

Mat*_*ias 0 java unit-testing apache-nifi

我正在尝试在Apache NiFi中创建一个自定义处理器,该处理器可以向流文件内容中的JSON对象添加属性/字符串。目前,当我仅使用字符串时它可以工作,但是当我使用NiFi的表达语言时,尽管我的代码中已支持它,但它不工作。

表达式语言是100%正确的,因为它可以在其他处理器中使用,并且我还尝试了其他属性以确保它不是该属性。

物业:

public static final PropertyDescriptor ADD_ATTRIBUTE = new PropertyDescriptor
        .Builder().name("Add Attribute")
        .description("Example Property")
        .required(true)
        .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
        .expressionLanguageSupported(true)
        .build();
Run Code Online (Sandbox Code Playgroud)

稍后在我的代码中,当我想获取值并放入JSON对象时,我会使用:

jsonObject.put("hostname", context.getProperty(ADD_ATTRIBUTE).evaluateAttributeExpressions().getValue());
Run Code Online (Sandbox Code Playgroud)

我还进行了单元测试,当我将文本值分配给testrunner.setProperty时,它可以工作。但是我不知道如何为测试运行器分配属性或如何在测试中使用表达式语言。

在此先感谢您的任何建议或解决方案!

mat*_*tyb 5

我也将Hortonworks Community Connection的答案也放在这里FWIW:

如果该表达式引用流文件上的属性,则需要将对该流文件的引用传递到validateAttributeExpressions中:

FlowFile flowFile = session.get();
jsonObject.put("hostname", context.getProperty(ADD_ATTRIBUTE).evaluateAttributeExpressions(flowFile).getValue());
Run Code Online (Sandbox Code Playgroud)

如果属性包含属性名称(而不是包含属性名称的Expression),并且您需要流文件中的值:

jsonObject.put("hostname", flowFile.getAttribute(context.getProperty(ADD_ATTRIBUTE).getValue()));
Run Code Online (Sandbox Code Playgroud)

如果属性值本身包含表达式语言,并且您想对其进行评估,请查看以下类:

org.apache.nifi.attribute.expression.language.Query
Run Code Online (Sandbox Code Playgroud)