我试着这样做:
<bean id="xsl1" class="com.transformation.XsltPayloadTransformer">
<property name="xslResource" value="#xpath('/root/someNode/text()', payload)">
</bean>
但它不起作用。
另外,我正在尝试这个:
<si:header-enricher id="environmentHeaderEnricher"
input-channel="inputChannel"
output-channel="prepareChannel">
<!-- <si-xml:header name="environment" xpath-expression-ref="environmentXpathExpression"/> -->
<si:header name="environment" expression="#xpath(payload, '/message/xslt', 'string')"/>
</si:header-enricher>
.....
<bean id="xsl1" class="transformation.XsltPayloadTransformer">
<property name="xslResource" value="#{headers.get('environment')}">
</bean>
我得到了:
引起: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0):在对象上找不到属性或字段“标题” 类型 'org.springframework.beans.factory.config.BeanExpressionContext' - 也许不公开?在 org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:215) 在 org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:85)
答案 0 :(得分:0)
实际上你错过了Bean Definition SpEL
和Spring Integration Runtime SpEL
之间的区别。
任何<bean>
SpEL在应用程序启动阶段只能运行一次,并且范围仅适用于Bean Factory环境。
Spring Integration SpEL在运行时在每个组件调用上工作,并在大多数情况下使用Message
作为根对象。当消息到达组件时,每次执行这些表达式。例如,您的environment
标头将填充到每个入站消息的出站消息,结果将基于请求消息的当前payload
。
由于xsl1
bean仅在init阶段应用SpEL,因此当前headers
上下文中没有BeanFactory
属性。
请在Spring Framework Reference Manual中阅读有关bean定义阶段的SpEL以及其手册中Spring Integration中的Runtime SpEL的更多信息。
现在尝试探索你想要实现的目标。