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);
我正在尝试使用 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);