我拆过的坑cycx

查询一下!

springboot使用CommonsMultipartResolver上传报错java.lang.ClassCastException

今天写了一个上传文件的接口,部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@PostMapping("/upload")
public Response<String> uploadPic(HttpServletRequest request) {
    Response<String> result = new Response<>();
  // 创建一个通用的多部分解析器
  CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
  if (!multipartResolver.isMultipart(request)) {
    LOG.error("上传文件错误!");
  }
 
  // request转换成multiRequest
  MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
}

debug的时候发现request转换的那一行报错如下:

java.lang.ClassCastException: org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to org.springframework.web.multipart.commons.CommonsMultipartFile

百度了一下,发现一堆解决方案,千篇一律,竟没有一个有用的,不禁吐槽一句:是百度垃圾还是我们国内的程序员们???最终,经过自己不懈的努力找到了最佳的解决方案,记录一下,防止以后忘记,又要百度。。。

 

一、原因分析:

Spring Boot默认会实例化一个MultipartResolver(StandardServletMultipartResolver)来处理上传文件,所以这里强转的话就会报以上类型转换错误。

 

二、解决方案:

1、如果要使用CommonsMultipartResolver,需要在application.properties里面添加一句:

1
spring.servlet.multipart.enabled=false

(注意是false,这样就会禁用StandardServletMultipartResolver,网上很多LJ文章居然说是true)。

 

2、自己手动创建一个CommonsMultipartResolver,代码就是我最上面的代码,然后在把HttpServletRequest转换成MultipartHttpServletRequest这一步的时候,使用如下代码:

1
2
// request转换成multiRequest
MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request);

  

至此,不再报错,完美解决!!!

 


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright Your WebSite.Some Rights Reserved.