Spring 集成 - 在 service-activator 嵌套 bean constructor-arg 中使用 SpEL

Spring Integration - Use SpEL in service-activator nested bean constructor-arg

我正在尝试使用 factory-method 来初始化 service-activator,如下所示

<int:service-activator>
    <bean class="com.sample.FileWriterFactory" factory-method="createFileWriter">
        <constructor-arg index="0" value="${xml.out-directory}/xml"/>
        <constructor-arg index="1" value="#{ headers['file_name'] + '.xml' }"/>
    </bean>
</int:service-activator>

但是,SpEL 评估失败,因为在评估上下文中找不到 headers 属性。确切的错误片段是

org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'headers' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public?

这样做的目的是想根据需要传递不同的参数来复用同一个POJO。 我做错了什么?

#{...} 表达式在上下文初始化期间计算一次。

像这样访问属性的表达式(例如headers)需要在运行时进行评估(针对作为根对象的消息)。

如果这就是您想要做的,请使用 value="headers['file_name'] + '.xml'",然后在您的构造函数中...

private final Expression expression;

public FileWriterFactory(String directory, String expression) {
    ...
    this.expression = new SpelExpressionParser().parseExpression(expression);
}

然后,在您的运行时服务方法中

String fileName = this.expression.getValue(message, String.class);