记一次解决“Required request part ‘file’ is not present”问题实录

男娘i 2024-04-17 06:07 158阅读 0赞

一、问题描述

数据库的主键采用的是17位的bigint,在实体类中使用Long类型存储,但是到前端会出现精度丢失的问题,于是就加了个配置类,在序列化的时候把Long类型转成字符串,解决了精度丢失的问题,但是却发现文件上传不了了。一直报“Required request part ‘file’ is not present”错误。

解决精度丢失的配置类代码如下

  1. import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  2. import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  7. @EnableWebMvc
  8. @Configuration
  9. public class WebConfig implements WebMvcConfigurer {
  10. /**
  11. * 解决Long类型数值位数超过17位,前端解析时,精度丢失的bug
  12. * @author changzhichen
  13. * @date 2019-07-22 13:21
  14. * @return org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer
  15. **/
  16. @Bean("jackson2ObjectMapperBuilderCustomizer")
  17. public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
  18. return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
  19. .serializerByType(Long.TYPE, ToStringSerializer.instance);
  20. }
  21. }

二、解决方案

去掉配置类上的@EnableWebMvc注解即可解决

原因可以参见这篇文章https://blog.csdn.net/zxc123e/article/details/84636521。

通过查看@EnableWebMvc的源码,可以发现该注解就是为了引入一个DelegatingWebMvcConfiguration 配置类,而DelegatingWebMvcConfiguration又继承于WebMvcConfigurationSupport。也就是说,如果我们使用@EnableWebMvc就相当于导入了WebMvcConfigurationSupport类,这个时候,Spring Boot的自动装配就不会发生了,我们能用的,只有WebMvcConfigurationSupport提供的若干个配置。其实不使用@EnableWebMvc注解也是可以实现配置Webmvc,只需要将配置类继承于WebMvcConfigurationSupport类即可。

当使用@EnableWebMvc时,加载的是WebMvcConfigurationSupport中的配置项。

当不使用@EnableWebMvc时,使用的是WebMvcAutoConfiguration引入的配置项。

个人分析,应该是加了@EnableWebMvc导致Springboot自动配置失效,MultipartFile 参数不能被成功解析,导致文件上传失败。

发表评论

表情:
评论列表 (有 0 条评论,158人围观)

还没有评论,来说两句吧...

相关阅读