2012-02-23 16 views
1

私のアプリケーションでjava.awt.BufferedImageオブジェクトとしてイメージを提供しようとしています。私はGETを実行しようとすると、ここでの結果は以下のとおりです。BufferedImageの提供中にSpring MVCコンテンツネゴシエーションが失敗する

  • は受け入れ:画像/ jpegのが有効な画像をレンダリングする
  • は受け入れ:*/* HTTP 406

を返すここで関連があります私のサーブレットのcontext.xmlの一部:

<beans:bean id="messageAdapter" 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <beans:property name="order" value="1" /> 
    <beans:property name="messageConverters"> 
     <beans:array> 
      <beans:bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/> 
     </beans:array> 
    </beans:property> 

</beans:bean> 

そして、ここでは私のコントローラである:

@RequestMapping(value = "photo/{photoId:[0-9]+}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) 
    @ResponseBody 
    public BufferedImage getPhoto(
     @PathVariable long photoId) { 
     return photoService.getPhoto(photoId); 
    } 

MediaType.IMAGE_JPEG_VALUEは「image/jpeg」です。 */*の受け入れヘッダがHTTP 406を生成しないことは私の理解である。によれば、呼び出し元はそのタイプのコンテンツを受け付けないことがわかる。

ほとんどのブラウザでは、受け入れヘッダーに「*/*」が付いているため、ユーザーが受け入れヘッダーをハードコードしない限り、このイメージを表示できないため、問題です。

ここに何か不足していますか?

ありがとうございます。

答えて

2

メッセージコンバーターはAcceptヘッダーに関するもので、@ResponseBodyで注釈が付けられたすべてのハンドラーに適用されるため、メッセージヘッダーを使用する必要があります。

あなたがこの問題を回避することができますいくつかの方法:

オプション1:だけでなくNOTEを*/*を処理するためにBufferedImageHttpMessageConverterを拡張:あなたは、すべてのとして、後に他のメッセージ・コンバータを追加した場合、これは予期しない結果をもたらすことができますJSONを生成したい突然のハンドラは、代わりに画像を生成し始めます。

public class ExtendedBufferedImageHttpMessageConverter extends BufferedImageHttpMessageConverter { 

    @Override 
    public boolean canWrite(Class<?> clazz, MediaType mediaType) { 
    if (mediaType.equals(MediaType.ALL)) { 
     return super.canWrite(clazz, MediaType.IMAGE_JPEG); 
    } else { 
     return super.canWrite(clazz, mediaType); 
    } 
} 

次に、通常のBufferedImageHttpMessageConverterの代わりにこれを使用してください。

オプション2:あなたのイメージのリクエストに適用されるフィルタやインターセプタを作成し、Acceptヘッダがimage/jpeg代わりの*/*のように見えるような方法で要求を包みます。これは、クライアントがjpegを受け取り、BufferedImageHttpMessageConverterをトリガーすると思うようになると思います。

+0

興味深いことに、これは間違いなく問題を明らかにしますが、私のアプリケーションもアプリケーション/ jsonデータを提供する必要があります。私は私の例ではそれを含めませんでしたが、MappingJacksonHttpMessageConverterも使用しています。これが当然追加されたとき、サーブレットはイメージをシリアル化してJSONを返そうとしました。私がしようとしているのは、BufferedImageHttpMessageConverterを意図どおりに使うことだと思います。 – Joe

+0

また、これを回避するためにこれを追加したかったのですか(これは解決策かもしれません)。@ResponseBodyのバイト配列に生データを入れ、image/jpegをサポートするByteArrayHttpMessageConverterを含めました。誰かが興味を持っているなら、私はこれのソースを含めることができます。 – Joe

関連する問題