Java Spring MVC内容协商在服务BuffereImage时失败

Java Spring MVC内容协商在服务BuffereImage时失败,java,spring-mvc,content-type,content-negotiation,Java,Spring Mvc,Content Type,Content Negotiation,我试图在我的应用程序中作为java.awt.buffereImage对象提供一个映像。当我尝试执行GET时,以下是结果: 接受:图像/jpeg渲染有效图片 接受:*/*返回HTTP 406 以下是我的servlet-context.xml的相关部分: <beans:bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAd

我试图在我的应用程序中作为java.awt.buffereImage对象提供一个映像。当我尝试执行GET时,以下是结果:

  • 接受:图像/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>
MediaType.IMAGE\u JPEG\u值为“IMAGE/JPEG”。我的理解是,*/*的accept头永远不会生成HTTP 406,根据我们的理解,它告诉我们调用方不接受该类型的内容

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

我是不是遗漏了什么


提前感谢。

消息转换器对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);
    }
}
公共类ExtendedBufferedImageHttpMessageConverter扩展BufferedImageHttpMessageConverter{
@凌驾
公共布尔canWrite(类clazz,MediaType-MediaType){
if(mediaType.equals(mediaType.ALL)){
返回super.canWrite(clazz,MediaType.IMAGE_JPEG);
}否则{
返回super.canWrite(clazz,mediaType);
}
}
然后在spring配置中使用它,而不是普通的BufferedImageHttpMessageConverter


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

Hmmmm很有意思。这肯定说明了这个问题,但我的应用程序也需要提供应用程序/json数据。我的示例中没有包括它,但我也使用MappingJacksonHttpMessageConverter。当它被添加回当然,servlet尝试序列化图像并返回JSON。我想我尝试的是按照预期的方式使用BufferedImageHttpMessageConverter。我还想添加它来解决这个问题(或者这就是解决方案)我把原始数据放在@ResponseBody的字节数组中,并包含了一个支持图像/jpeg的ByteArrayHttpMessageConverter。如果有人感兴趣,我可以包含这个的源代码。
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);
    }
}