Spring Integration - http出站网关自定义标头

时间:2011-10-19 14:20:07

标签: http header spring-integration outbound

我想将java对象作为自定义标头传递给我在http出站网关上的请求。以下是一个片段

<int:gateway id="service" service-interface="MyService" default-request-channel="requestChannel" default-reply-channel="replyChannel">
    <int:method name="doSomething" payload-expression="#args[0] + ',' + #args[1]">
        <int:header name="method_name" value="login"/>
        <int:header name="service_identifier" value="myService"/>
        </int:method>                
</int:gateway>

<int:header-enricher input-channel="requestChannel" output-channel="gatewayChannel">
       <int:header name="user_context" expression="T(UserContextHolder).getContext()"/>
</int:header-enricher>

<int-http:outbound-gateway request-channel="gatewayChannel" url="myURL" mapped-request-headers="user_context, service_identifier, method_name, HTTP_REQUEST_HEADERS"
          http-method="POST" reply-channel="replyChannel"/>

UserContext可以是java对象

UserContext implements Serializable {
    String userId;
    RequestParameters params;
    ScopeEnum scope;
    ....
}

我遇到的问题是标题user_context没有映射到标题中。从日志中,我可以看到DefaultHttpHeaderMapper正在请求转换器或ConversionService。见下文 -

09:54:59,488 - WARN main      org.springframework.integration.http.support.DefaultHttpHeaderMapper - Header 'X-    user_context' with value 'UserContextImpl@5e3ca754' will not be set since it is not a String     and no Converter is available. Consider registering a Converter with ConversionService     (e.g., <int:converter>)

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:0)

标准HTTP标头采用密钥:值格式,密钥和值均为字符串。 您尝试将对象作为HTTP标头值发送,这不是很明智(并且几乎不可能,因为标头的大小可能有一些限制 - 例如,8KB Apache默认限制)。

您有三种选择:

  1. 考虑不使用HTTP出站网关并使用JMS(我认为最好的)

  2. 添加将UserContext序列化为String的变换器(如果它是相对短的字符串就可以了,在另一种情况下我不推荐它)

    < / LI>
  3. 实现自定义转换器UserContext-&gt; String,如Spring参考文档的Datatype Channel Configuration部分所述: http://static.springsource.org/spring-integration/reference/htmlsingle/#channel-configuration