Spring Integration http入站网关映射响应头 - 是否重复?

时间:2012-07-14 19:10:41

标签: content-type spring-integration

我正在尝试为图像主机服务设置响应的内容类型,所以我有一个http:inbound-gateway,如下所示:

<int-http:inbound-gateway request-channel="receiveChannel"
                          reply-channel="responseChannel"
                          path="/profile/photo"
                          mapped-response-headers="Content-Type"
                          message-mappers="messageConverterList"
                          supported-methods="GET"/>

......以及一个看起来像这样的服务激活器:

<int:service-activator 
    input-channel="receiveChannel" 
    output-channel="imageResponseChannel"
    expression="@profileService.getPhoto(payload.userId)"/>

...返回jpeg图像数据的byte []。我有一个如下所示的标题:

<int:header-enricher
    input-channel="imageResponseChannel"
    output-channel="responseChannel">
    <int:header
        name="Content-Type"
        expression="'image/jpeg'"/>
</int:header-enricher>

但是当我运行该项目时,我得到一个响应,其中包含以下标题:

< HTTP/1.1 200 OK
< Set-Cookie: JSESSIONID=9uw5c136fia6s9ivxgivy1yc;Path=/
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< Content-Type: image/jpeg
< Content-Type: application/octet-stream
< Content-Length: 6563
< Server: Jetty(8.1.3.v20120416)

请注意,内容类型会重复,但我的理解是mapped-response-headers应该从消息中获取标题,而不是从有效负载中确定它。

有什么想法吗?提前谢谢!

*编辑:我更改了入站网关以引用下面的自定义消息映射器,但我仍然得到相同的结果。

<util:list id="messageConverterList">
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list><value>image/jpeg</value></list>
        </property>
    </bean>
</util:list>

*编辑2:原来它应该是消息转换器,但我没有收到错误,因为我修改了目标文件而不是src。我做了更正,这是我得到的输出:

< HTTP/1.1 200 OK
< Content-Type: image/jpeg
< Content-Type: image/jpeg
< Content-Length: 209582
< Server: Jetty(6.1.10)

更好,但不完美。这是一个简单的问题再现项目:http://dl.dropbox.com/u/92800052/http.tar.gz

你可以用

运行它
mvn package jetty:run 

并使用

查看输出
curl -v http://localhost:8080/http/photo > /dev/null

1 个答案:

答案 0 :(得分:0)

默认情况下,为入站网关注册了几个HttpMessageConverters(来自核心Spring Web lib)。其中一个是ByteArrayHttpMessageConverter,它的默认内容类型是&#34; application / octet-stream&#34;。您可以尝试设置&#34;消息转换器&#34;您的网关上的属性,以便它引用包含ByteArrayHttpMessageConverter的单个实例的List类型的bean(例如,您可以使用util:list) - 而不是依赖于默认转换器,然后在该实例上将supportedMediaTypes属性设置为&# 39;图像/ JPEG&#39;

AFAIK,ByteArrayHttpMessageConverter不应该尝试设置Content-Type标头(如果已存在)(即来自映射的响应标头),但我只是想检查并确定该更改是否确实绕过了重复。

另外,您能告诉我们您正在使用的Spring Integration版本吗?

谢谢, 标记