如何在bean方法中获取头值

时间:2013-04-01 15:43:51

标签: spring spring-integration

我有自定义bean,我在spring集成流程中使用它。它有一个方法,它将hashmap作为参数,并且它的值是动态设置的。我试图从有效负载头字段(iploc)设置值,但我无法实现。我尝试了一些拼写的组合,但它不起作用。有什么指针吗?

<int:transformer id="ws.transformer"
    input-channel="ws.transformer.in" output-channel="ws.transformer.out">
    <bean class="com.my.Mybean">
        <property name="map">
            <map>
                <entry key="user">
                    <value>"admin"</value>
                </entry>
                <entry key="location">
                    <value>"headers['iploc']"</value>
                </entry>            
            </map>
        </property>
    </bean>
</int:transformer> 

我可以在服务激活器中设置值,但我正在尝试,如果我在SI配置中实现这一点。

2 个答案:

答案 0 :(得分:5)

Spring Integration Transformer可以使用整个Message(有效负载和标头),因此没有必要按属性传递标头值,因为变换器已经可以访问所有消息标头。

您的变换器bean定义应该只包含那些不是来自被转换的Message的属性:

<int:transformer id="ws.transformer" input-channel="ws.transformer.in" output-channel="ws.transformer.out">
  <bean class="com.my.MyTransformer">
    <property name="user" value="admin"/>                    
  </bean>
</int:transformer> 

你的变压器方法:

@Transformer
OutgoingPayload transform(IncomingPayload payload, @Header("iploc") String iplocHeader) {
    return doTransform(...);
}

或只是消费整个邮件:

Message<OutgoingPayload> transform(Message<IncomingPayload> message) {
  final String ipLocHeaderValue = message.getHeaders.get("iploc", String.class);
  return doTransform(...);
}

答案 1 :(得分:1)

在类似转换器中定义的bean将在启动时实例化,而不是每次收到消息时实例化。处理这样一个需求的正常方法是让一个无状态bean的方法在每次调用时接受头值。