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

How to use Spring XD Module Options in SpEL expression of Spring Integration DSL?

我正在实施自定义 Spring XD 模块(处理器)。 我已经向其中添加了模块选项,可以通过 @Value("${varName}") 语法在 ModuleConfiguration 中轻松引用它们。

但是,我不能直接在流生成器的 SpEL 表达式中使用它们:

return IntegrationFlows
            .from(input)
            .enrichHeaders(h -> h
                    .headerExpression("varHeader", "varName") //That's the line with an issue
            )
            .transform(customTransformer)
            .channel(output)
            .get();

有没有办法直接在 flow builder 中使用,而不是注入到配置 bean 中?

这不是 Spring XD 的问题,也不是 Spring 集成 Java DSL 甚至 Java 和注释配置的问题。

Java 配置和 XML 配置(在本例中)之间的区别,XML bean 定义的属性经历了添加转换阶段 - BeanDefinition 属性合并。有助于目标对象的创建。

有了它,您可以使用 属性 占位符值定义 expression 属性,以便在创建 targeg 对象之前提取。

是的,使用 Java Config 我们也有 BeanDefinition,但是使用 Java Config 对象实例化完全掌握在您手中。因此任何 set...() 都在容器范围之外,它无法确定您的值是 属性 占位符。

Java & Annotation 配置建议使用 @Value("${varName}") 并直接在你的 @Bean 方法中使用该值。从另一边,您甚至可以将该注释移动到方法定义中:

@Bean
public IntegrationFlow myFlow(@Value("${varName}") String myValue) {
.....
}

还有一个技巧,不太优雅,因为它有点冗长:

.headerExpression("varHeader", "@environment.getProperty('varName')") 

解析 属性 占位符的 Environment 作为 bean 公开,任何 Spring 集成表达式都可以访问 bean 工厂。 唯一的瓶颈是将针对每条消息评估此表达式,而不是像在 @Value("${varName}").

的情况下那样评估一次