异常:
我项目中使用MappingJackson2HttpMessageConverter + ObjectMapper全局处理时间对象的响应格式统一转换,但是项目中添加文件上传下载功能后,文件下载和图片查看时(响应对象是ResponseEntity<byte[]>),抛出了如下异常:
org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class [B] with preset Content-Type 'image/jpeg'
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:313) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:226) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
异常的大概意思是:没有‘image/jpeg’类型的转换器。
代码:
我的WebMvcConfiguration中Convert配置如下:
JacksonHttpMessageConverter是我的MappingJackson2HttpMessageConverter实现类。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
JacksonHttpMessageConverter converter = new JacksonHttpMessageConverter();
converters.add(converter);
}
解决:
从异常中可以得知,是因为缺少了‘image/jpeg’类型的转换,而image/jpeg等文件类型响应时是字节数组(byte[]),所以我们只需要加上字节数组转换器即可:对WebMvcConfiguration的Converts进行修改,如下:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
JacksonHttpMessageConverter converter = new JacksonHttpMessageConverter();
converters.add(converter);
// 添加字节数组转换器:用以文件下载时字节流的响应
converters.add(new ByteArrayHttpMessageConverter());
}
总结:
这个问题我在网上找了很久,都没有类似的问题,最后只发现了一个博主的文章,他用的是SpringMVC配置的字节数组转换器,同理我在SpringBoot项目中解决该问题,特意发布本文章,供后续开发者遇见该问题能尽快解决。创作不易,如对您有用,麻烦点赞。