Spring集成 - 在service-activator嵌套bean构造函数arg中使用SpEL

时间:2017-03-25 11:34:40

标签: spring-integration spring-el

我正在尝试使用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:在'org.springframework.beans.factory.config.BeanExpressionContext'类型的对象上找不到属性或字段'headers' - 可能不公开?

这样做的目的是我希望通过根据需要传递不同的参数来重用相同的POJO。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

在上下文初始化期间,

#{...}表达式被评估一次。

访问属性(例如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);