You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:49:58