Spring Integration - пользовательские заголовки исходящего шлюза http - PullRequest
0 голосов
/ 19 октября 2011

У меня есть 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 голосов
/ 28 октября 2011

Стандартные заголовки HTTP находятся в формате ключ: значение, а ключ и значение являются строками. Вы пытаетесь отправить объект как значение заголовка HTTP, что не очень разумно (и почти невозможно, потому что могут быть некоторые ограничения на размер заголовков - например, ограничение по умолчанию Apache 8 КБ).

У вас есть три варианта:

  1. Не стоит использовать исходящий HTTP-шлюз и вместо этого используйте JMS (лучший на мой взгляд)

  2. Добавить преобразователь, который будет сериализовать UserContext в String (если бы это была относительно короткая строка, то все было бы в порядке, в противном случае я бы не рекомендовал ее)

  3. Реализация пользовательского преобразователя UserContext-> String, как описано в разделе Datatype Channel Configuration справочной документации по пружине: http://static.springsource.org/spring-integration/reference/htmlsingle/#channel-configuration
...