java - 提供 BufferedImage 时 Spring MVC 内容协商失败

标签 java spring-mvc content-type content-negotiation

我试图在我的应用程序中将图像作为 java.awt.BufferedImage 对象提供服务。当我尝试执行 GET 时,结果如下:

  • 接受:image/jpeg 渲染有效图片
  • 接受:*/* 返回 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>

这是我的 Controller :

    @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”。据我了解,*/* 的接受 header 永远不会生成 HTTP 406,根据 this page告诉我们调用者不接受该类型的内容。

这是一个问题,因为大多数浏览器的接受 header 中都有“*/*”,除非用户硬编码接受 header ,否则无法查看此图像。

我在这里遗漏了什么吗?

提前致谢。

最佳答案

消息转换器对 Accept header 很挑剔,而且它们必须如此,因为它们应用于所有用 @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 。

选项 2:创建应用于图像请求的过滤器或拦截器,并以 Accept header 看起来像 image/jpeg 而不是的方式包装请求*/*。这将“欺骗”客户端认为客户端接受 jpeg 并触发 BufferedImageHttpMessageConverter。

关于java - 提供 BufferedImage 时 Spring MVC 内容协商失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423373/

相关文章:

java - 删除数组元素 - 将所有元素向下移动一个索引

Spring 属性占位符未在 jaxws :client (cxf) address property 中解析

java - 在 Spring 3.2 中禁用路径变量中的空格修剪

Java正则表达式错误

java - 如何使用 Jackson Streaming API 处理自定义 boolean 字符串

java - 无法统计应用程序。将 SpringBoot 从 2.0.6.RELEASE 更新到 2.1.0.RELEASE 后

Firefox 增强了 XMLHttpRequest 的内容类型

javascript - 如何将rails响应头设置为json?

c# - 如何为 HttpClient 请求设置 Content-Type header ?

java - 在android中有效地绘制正弦波