如何在 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}")
.
的情况下那样评估一次
我正在实施自定义 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}")
.