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

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

我正在实现一个自定义 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();

有没有办法直接在流程构建器中使用,而不是注入(inject)到配置bean中?

最佳答案

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

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

这样,您就可以使用要在创建目标对象之前提取的属性占位符值来定义您的表达式 属性。

是的,使用 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')") 

解析属性占位符的环境作为bean公开,并且任何Spring集成表达式都可以访问bean工厂。 唯一的瓶颈是为每条消息计算此表达式,而不是像 @Value("${varName}") 的情况那样计算一次。

关于java - 如何在 Spring Integration DSL 的 SpEL 表达式中使用 Spring XD 模块选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696239/

相关文章:

java - Spring Boot Filter 没有过滤我所有的日志

java - MVC Java Swing如何从 View 正确从数据库获取数据

java - getInputStream 卡住并且永远不会完成

java - 使用mockbean后无法调用真正的方法

java - 如何使用 DSL 为 ack/nack 和返回队列配置 amqp-outbound 适配器?

java - spring 与 activemq 集成

java - Spring 集成 : Not able to send the message to channel

java - TableView 静态时不显示列

java - 我真的需要在 Spring 中创建接口(interface)吗?

spring - 使用 springSecurityFilterChain 从 Spring MockMvc 清空响应 header