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

Spring MVC:如何解决415 UNSUPPORTED_MEDIA_TYPE响应错误

解决Spring PUT接口返回415 UNSUPPORTED_MEDIA_TYPE的问题

先帮你拆解两个请求里的问题,以及你可能遗漏的核心关键点:

第一个请求(Map参数)的问题

你第一个curl请求用了--data 'kbo=123.456.789',这种方式发送的请求默认Content-Type是application/x-www-form-urlencoded(表单键值对格式),但你的接口用了@RequestBody注解——这个注解是用来接收请求体为JSON/XML等结构化格式的数据,而非表单格式。Spring找不到能解析表单格式到Map<String, String>的消息转换器,所以直接返回415错误。

如果想让第一个请求正常工作,你可以把@RequestBody换成@RequestParam,比如:

@PutMapping(value = "/public-certificates")
public List<CertificateDTO> updateCertificates(@RequestParam String kbo) {
    List<CertificateDTO> certificates = organizationClient.updateCertificates(kbo);
    return certificates;
}

对应的curl请求不需要修改,保持原来的即可。

第二个请求(自定义DTO)的问题

你改成用CompanyNumber类接收后,虽然加了正确的Content-Type: application/json请求头,但还是报错,核心问题出在内部类的访问修饰符上:

你的CompanyNumber是private的非静态内部类:

@Getter
@Setter
private class CompanyNumber {
    private String kbo;
}

Spring的JSON消息转换器(Jackson)需要实例化这个类来解析请求体,但private的非静态内部类只能在它的外部类OrganizationController内部被实例化,Jackson无法访问到它的构造方法,自然无法完成反序列化,最终导致415错误。

解决方法很简单,把这个内部类改成public static的,或者把它抽成一个独立的顶级类:

@Getter
@Setter
public static class CompanyNumber {
    private String kbo;
}

这样Jackson就能正常实例化这个类,解析你的JSON请求体了。

额外的检查点

如果修改后还是有问题,可以再排查这几点:

  • 确保项目里有Jackson依赖:如果是Spring Boot项目,引入spring-boot-starter-web就会自动包含jackson-databind;如果是手动搭建的Spring项目,需要手动引入这个依赖。
  • 检查请求体的JSON格式是否正确:比如有没有拼写错误、引号是否匹配,避免出现语法错误的JSON。
  • 确认应用上下文路径配置:你的Controller是@RequestMapping("/organization"),但curl请求的是/api/organization/...,确保application.properties里配置了server.servlet.context-path=/api(不过你返回的是415而非404,这一点大概率没问题)。

内容的提问来源于stack exchange,提问作者belgoros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:44:04