1

イメージ ホスト サービスの応答のコンテンツ タイプを設定しようとしているので、次のような 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)

content-type が繰り返されていることに注意してください。ただし、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
4

1 に答える 1

0

デフォルトでは、いくつかの HttpMessageConverters (コア Spring Web lib から) が受信ゲートウェイに登録されています。その 1 つが ByteArrayHttpMessageConverter で、デフォルトのコンテンツ タイプは「application/octet-stream」です。ゲートウェイに「message-converters」属性を設定して、デフォルトのコンバーターに依存するのではなく、ByteArrayHttpMessageConverter の単一のインスタンスを含むリスト型の Bean を参照するようにしてください (たとえば、util:list を使用できます)。そのインスタンスで、supportedMediaTypes プロパティを「image/jpeg」に設定します。

私の知る限り、ByteArrayHttpMessageConverter は、既に存在する場合 (つまり、マップされた応答ヘッダーから) Content-Type ヘッダーを設定しようとすべきではありませんが、その変更が実際に重複をバイパスするかどうかを確認したいだけです。

また、使用している Spring Integration のバージョンを教えてください。

ありがとう、マーク

于 2012-07-15T21:05:53.943 に答える