如何在Spring Integration DSL的SpEL表达式中使用Spring XD模块选项?

时间:2016-02-29 09:43:01

标签: java spring spring-integration spring-xd spring-el

我实现了自定义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?

1 个答案:

答案 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}")一样评估该表达式。