2012-07-14 83 views
1

我正在尝试设置内容类型的图像主机服务的响应,所以我有一个http:入站网关,看起来像这样:Spring集成http入站网关映射的响应头 - 被复制?

<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) 

注意,内容类型是重复的,但它是我的理解是,映射响应头应该从消息中抓取标题,而不是从有效载荷中确定它。

任何想法?提前致谢!

*编辑:我改变了入站网关引用下面的自定义消息映射器,但我仍然得到相同的结果。编辑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 

回答

0

默认情况下,几个HttpMessageConverters(从核心的Spring Web LIB)为入站网关注册。其中之一是ByteArrayHttpMessageConverter,它的默认内容类型是“application/octet-stream”。您可以尝试在网关上设置“message-converters”属性,以便它引用包含ByteArrayHttpMessageConverter单个实例的List-typed bean(例如,您可以使用util:list) - 而不是依赖默认转换器,然后在该实例中将supportedMediaTypes属性设置为'image/jpeg'。 AFIK,ByteArrayHttpMessageConverter不应该尝试设置一个Content-Type头(如果已经存在的话)(即来自映射的响应头),但我只是想检查并确定这个改变是否真的绕过了重复。

另外,您可以让我们知道您使用的是什么版本的Spring集成?

谢谢, 马克

+0

当然。我正在使用2.1.3.RELEASE。我添加的代码在编辑中,以及结果(因为我不能在注释中添加代码)。 – Joe 2012-07-16 14:23:34

+0

你可以尝试一件事...在标题丰富你可以使用小写,而不是大写“内容类型”? – mfisher 2012-07-16 16:23:35

+0

我只是尝试了下面的框头内容类型的头文件richher,然后在网关中每次都有相同的结果(重复的Content-Type HTTP头文件)。我可以创建一个消毒版本的项目并将其发布到github上。你认为这会有帮助吗? – Joe 2012-07-16 21:28:11

相关问题