Java Spring MVC内容协商在服务BuffereImage时失败
我试图在我的应用程序中作为java.awt.buffereImage对象提供一个映像。当我尝试执行GET时,以下是结果: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
- 接受:图像/jpeg渲染有效图片
- 接受:*/*返回HTTP 406
<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);
}
}