Spring Boot中multipart/form-data类型POST请求报错排查
问题解决指南
一、405请求方法不支持错误修复
你的@PostMapping注解用法错误,直接传入MediaType.MULTIPART_FORM_DATA_VALUE会把请求路径设置为/product/multipart/form-data,而非指定接口支持的请求媒体类型。正确写法要通过consumes属性声明接口接收multipart/form-data类型请求:
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<Object> saveProduct (@RequestPart("productDto") @Valid ProductDto productDto, @RequestPart(value = "file")MultipartFile file) { // 原有逻辑保持不变 }
修改后,接口会正确匹配POST /product路径的multipart请求,彻底解决405错误。
二、Jackson反序列化异常修复
UnrecognizedPropertyException说明请求传递的productDto包含ProductDto类未定义的属性,或者字段命名不匹配(比如请求用下划线命名、实体类用驼峰命名且未配置自动转换)。
解决方式:
- 核对Postman中
productDto的所有属性,确保和ProductDto类的字段完全一致,包括名称、大小写。 - 若需要支持驼峰与下划线的自动转换,在Spring配置中添加Jackson属性命名策略:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); return mapper; } } - 也可以在
ProductDto类上添加@JsonIgnoreProperties(ignoreUnknown = true)注解忽略未知属性(不推荐,会掩盖字段配置错误):@JsonIgnoreProperties(ignoreUnknown = true) public class ProductDto { // 类字段定义 }
额外注意点
你的BUCKET_NAME定义存在逻辑问题:private final String BUCKET_NAME = "awstockproducts" + System.currentTimeMillis();,每次控制器实例化都会生成新桶名,导致S3上传时找不到正确存储桶。建议将桶名设为固定值,或从配置文件读取:
// 固定桶名 private final String BUCKET_NAME = "awstockproducts"; // 或从配置文件读取 @Value("${aws.s3.bucket.name}") private String bucketName;
内容的提问来源于stack exchange,提问作者Routfin
相关产品推荐
相关产品推荐

