从xpath有效内容设置bean属性

时间:2014-09-05 08:33:23

标签: spring spring-integration spring-el spelevaluationexception

我试着这样做:

<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)

1 个答案:

答案 0 :(得分:0)

实际上你错过了Bean Definition SpELSpring 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的更多信息。

现在尝试探索你想要实现的目标。