Spring MVC:如何解决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

