记一次解决“Required request part ‘file’ is not present”问题实录
一、问题描述
数据库的主键采用的是17位的bigint,在实体类中使用Long类型存储,但是到前端会出现精度丢失的问题,于是就加了个配置类,在序列化的时候把Long类型转成字符串,解决了精度丢失的问题,但是却发现文件上传不了了。一直报“Required request part ‘file’ is not present”错误。
解决精度丢失的配置类代码如下
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 解决Long类型数值位数超过17位,前端解析时,精度丢失的bug
* @author changzhichen
* @date 2019-07-22 13:21
* @return org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer
**/
@Bean("jackson2ObjectMapperBuilderCustomizer")
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}
}
二、解决方案
去掉配置类上的@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 参数不能被成功解析,导致文件上传失败。
还没有评论,来说两句吧...