0

我有 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 正在请求 Converter 或 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>)

请问我该怎么做?

谢谢!

4

1 回答 1

0

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

你有三个选择:

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

  2. 添加将序列化UserContext到的转换器String(如果它是相对较短的字符串就可以了,在其他情况下我不推荐它)

  3. 实现自定义转换器 UserContext->String 如Datatype Channel Configuration弹簧参考文档部分所述: http: //static.springsource.org/spring-integration/reference/htmlsingle/#channel-configuration
于 2011-10-27T21:48:43.320 回答