3

我有自定义 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 配置本身中实现这一点。

4

2 回答 2

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(...);
}
于 2013-06-25T20:49:41.100 回答
1

The bean defined within a transformer like that will be instantiated at startup time, not each time a message is received. The normal way to handle a requirement like this is to have a stateless bean with a method that accepts the header value upon each invocation.

于 2013-04-02T12:17:23.310 回答