我试图在Apache NiFi中创建一个自定义处理器,可以在flowfile内容中向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();
稍后在我的代码中,当我想获取值并放入我使用的JSON对象时:
jsonObject.put("hostname", context.getProperty(ADD_ATTRIBUTE).evaluateAttributeExpressions().getValue());
我还进行了单元测试,当我为testrunner.setProperty分配文本值时,它可以正常工作。但是,我不知道如何为testrunner分配属性或如何在测试中使用表达式语言。
提前感谢任何建议或解决方案!
答案 0 :(得分:4)
我会把Hortonworks Community Connection的回答放在这里FWIW:
如果表达式引用流文件上的属性,则需要将对流文件的引用传递给evaluateAttributeExpressions:
FlowFile flowFile = session.get();
jsonObject.put("hostname", context.getProperty(ADD_ATTRIBUTE).evaluateAttributeExpressions(flowFile).getValue());
如果属性包含属性名称(而不是包含属性名称的Expression),并且您想要流文件中的值:
jsonObject.put("hostname", flowFile.getAttribute(context.getProperty(ADD_ATTRIBUTE).getValue()));
如果属性值本身包含表达式语言,并且您想要对其进行评估,请查看以下类:
org.apache.nifi.attribute.expression.language.Query
答案 1 :(得分:1)
关于测试...
假设您正在针对传入的FlowFile(evaluateAttributeExpressions(flowFile))评估表达式语言,那么您可以执行以下操作:
runner.setProperty(ADD_ATTRIBUTE, "${my.attribute}");
然后创建一个包含my.attribute的属性Map:
final Map<String,String> attributes = new HashMap<>();
attributes.put("my.attribute", myAttribute);
然后将一些内容列入以下属性:
runner.enqueue(fileIn, attributes);
runner.run();
代码库中的一个例子: