我实现了自定义Spring XD模块(处理器)。
我已经为其添加了“模块选项”,可以通过ModuleConfiguration
语法在@Value("${varName}")
中轻松引用它们。
但是,我无法在流构建器的SpEL表达式中直接使用它们:
return IntegrationFlows
.from(input)
.enrichHeaders(h -> h
.headerExpression("varHeader", "varName") //That's the line with an issue
)
.transform(customTransformer)
.channel(output)
.get();
有没有办法直接在流构建器中使用,而不是注入配置bean?
答案 0 :(得分:2)
这不是Spring XD的问题,也不是Spring Integration Java DSL甚至只是Java&注释配置。
Java Config和XML配置(在本例中)之间的区别,XML bean定义的属性经历了添加转换阶段 - BeanDefinition
属性合并。它对目标对象的创建很有帮助。
使用它可以定义expression
属性,并在创建目标对象之前提取属性占位符值。
是的,使用Java Config我们也有BeanDefinition
,但是使用Java Config,对象实例化完全掌握在您手中。因此,任何set...()
都不在Container范围内,并且无法确定您的值是否属于Property Placeholder。
Java&注释配置建议使用@Value("${varName}")
并直接在@Bean
方法中使用该值。从另一方面,您甚至可以将该注释移动到方法定义中:
@Bean
public IntegrationFlow myFlow(@Value("${varName}") String myValue) {
.....
}
还有另外一个技巧,它不会那么优雅,因为它有点冗长:
.headerExpression("varHeader", "@environment.getProperty('varName')")
解析Property Place的Environment
公开为bean,任何Spring Integration Expressions都可以访问bean工厂。
只针对每条消息评估此表达式的瓶颈,而不是像@Value("${varName}")
一样评估该表达式。