我从外部应用程序接收并加载模板化文本内容,并将占位符(如下所示)加载到名为app_template的flowFile属性:
Hello ${firstname} ${lastname},
thanks for contacting ${repname} and ${company}.
模板中的占位符需要替换为NiFi属性,在上游初始化,并且这些属性不是预先定义的。基本上,该模板可以包含任何属性名称。
是否可以评估该模板并解析属性,以便NiFi将$ {firstname}和$ {lastname}替换为相应的属性值而不使用替换字符串函数?
像$ {app_template:evaluateAttributes()} ...
这样简单谢谢!
答案 0 :(得分:3)
您可以绝对评估Apache NiFi表达式语言中的其他属性。我相信您的问题是您尝试在定义其他属性的同一有效时间执行此操作,因此这不起作用(属性定义在单个处理器配置中不确定)。
但是,通过使用UpdateAttribute
处理器,您可以根据需要使用其他属性的内容填充属性。我创建了a template which does this来演示。
--------------------------------------------------
Standard FlowFile Attributes
Key: 'entryDate'
Value: 'Fri Feb 16 20:48:52 PST 2018'
Key: 'lineageStartDate'
Value: 'Fri Feb 16 20:48:52 PST 2018'
Key: 'fileSize'
Value: '63'
FlowFile Attribute Map Content
Key: 'appendFullName'
Value: 'Andy LoPresto'
Key: 'filename'
Value: '422457211196462'
Key: 'firstName'
Value: 'Andy'
Key: 'fullName'
Value: ' '
Key: 'joinFullName'
Value: 'Andy LoPresto'
Key: 'lastName'
Value: 'LoPresto'
Key: 'path'
Value: './'
Key: 'substitutionFullName'
Value: 'Andy LoPresto'
Key: 'uuid'
Value: '2a8ba776-e059-46b2-bc5e-ccafd509356d'
--------------------------------------------------
This is a message generated at 2018/02/16 20:48:52.362 -0800.
答案 1 :(得分:2)
您可以通过以下代码使用ExecuteGroovyScript处理器
import groovy.text.SimpleTemplateEngine
def ff=session.get()
if(!ff)return
//read template from flow file content
def template = ff.read().withReader("UTF-8"){r->
new SimpleTemplateEngine().createTemplate(r)
}
//get attributes and make a copy because for template it should be midifiable
def attr = new HashMap(ff.getAttributes())
//build template with attributes as binding variables
ff.write("UTF-8"){w->
template.make(attr).writeTo(w)
}
REL_SUCCESS << ff
注意:
此模板支持groovy和jsp表达式:${ firstname }
和<%= firstname %>
您还可以使用类似jsp的常规代码注入:<% out.print( firstname.toUpperCase() ) %>
答案 2 :(得分:1)
我刚刚找到另一个SO答案,看起来唯一的方法就是使用脚本处理器 In Apache NiFi, can I evaluate expression language without an attribute?