MappingJackson2HttpMessageConverter导致byte[]响应与文件下载异常

异常:

我项目中使用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项目中解决该问题,特意发布本文章,供后续开发者遇见该问题能尽快解决。创作不易,如对您有用,麻烦点赞。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,你可以使用 `ResponseEntity` 来将文件的 `byte[]` 数组作为下载文件响应给接口调用。 首先,确保你的接口方法返回类型为 `ResponseEntity<byte[]>`。 然后,你可以使用以下代码示例来实现文件下载: ```java import org.springframework.core.io.ByteArrayResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; // ... @GetMapping("/download") public ResponseEntity<byte[]> downloadFile() throws IOException { // 从某处获取文件的 byte[] 数组 byte[] fileBytes = getFileBytes(); // 将文件字节数组包装为 ByteArrayResource 对象 ByteArrayResource resource = new ByteArrayResource(fileBytes); // 设置响应头信息 HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", "filename.txt"); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 返回带有文件字节数组的 ResponseEntity return ResponseEntity.ok() .headers(headers) .contentLength(fileBytes.length) .body(fileBytes); } ``` 在上述示例中,`getFileBytes()` 方法用于获取文件的 `byte[]` 数组。你可以根据自己的需求从文件系统、数据库或其他来源获取该数组。 然后,通过创建 `ByteArrayResource` 对象,将 `byte[]` 数组包装为一个资源。 接下来,设置响应头信息,包括文件名和内容类型。 最后,通过返回一个带有文件字节数组的 `ResponseEntity` 对象,将文件作为下载文件响应给接口调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值