1

アプリケーションでイメージを java.awt.BufferedImage オブジェクトとして提供しようとしています。GET を実行しようとすると、結果は次のようになります。

  • Accept:image/jpeg は有効な画像をレンダリングします
  • Accept:*/* は HTTP 406 を返します

私の servlet-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 は「画像/jpeg」です。*/* の受け入れヘッダーが HTTP 406 を生成することは決してないことを理解しています。これは、このページによると、呼び出し元がそのタイプのコンテンツを受け入れないことを示しています。

これは問題です。これは、ほとんどのブラウザの Accept ヘッダーに「*/*」が含まれており、ユーザーが Accept ヘッダーをハードコーディングしない限り、この画像を表示できないためです。

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

前もって感謝します。

4

1 に答える 1

2

メッセージ コンバーターは Accept ヘッダーにうるさい@ResponseBodyです。

これを回避するには、いくつかの方法があります。

オプション 1: 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);
    }
}

次に、Spring 構成で通常の BufferedImageHttpMessageConverter の代わりにこれを使用します。

Acceptオプション 2: 画像リクエストに適用されるフィルターまたはインターセプターを作成し、ヘッダーがimage/jpegではなく次のようになるようにリクエストをラップします*/*。これは、クライアントが jpeg を受け入れて BufferedImageHttpMessageConverter をトリガーすると考えるように「トリック」します。

于 2012-02-24T12:28:03.150 に答える