AWS SNS HTTP订阅调用Spring Boot端点遇Unsupported Media Type错误求助
解决AWS SNS HTTP订阅推送text/plain内容到Spring Boot端点的媒体类型错误
一、能否强制SNS发布者使用application/json?
不行。AWS SNS的HTTP/HTTPS订阅推送机制默认就是以text/plain; charset=UTF-8作为Content-Type发送消息,无论消息内容是否为JSON格式,都无法直接配置强制改为application/json。
二、Spring Boot控制器端的解决办法
方案1:手动解析text/plain格式的JSON字符串
直接用String接收请求体,再通过Jackson的ObjectMapper手动转换为目标DTO对象:
@RestController public class MyController { private final ObjectMapper objectMapper; // 注入Spring默认的ObjectMapper public MyController(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @PostMapping(value = "/path", consumes = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<Void> action(@RequestBody String body) throws IOException { // 将text/plain的JSON字符串转换为自定义DTO MyDto dto = objectMapper.readValue(body, MyDto.class); // 执行你的业务逻辑 System.out.println("Received name: " + dto.getName()); return ResponseEntity.noContent().build(); } // 定义对应的DTO类 static class MyDto { private String name; // getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } } }
方案2:添加自定义HttpMessageConverter自动解析
通过配置让Spring的Jackson转换器支持text/plain媒体类型,这样就能直接用DTO接收请求体,无需手动转换:
第一步:配置消息转换器
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); // 为Jackson转换器添加text/plain媒体类型支持 jacksonConverter.getSupportedMediaTypes().add(MediaType.TEXT_PLAIN); converters.add(jacksonConverter); } }
第二步:修改控制器方法
@RestController public class MyController { // 同时支持application/json和text/plain两种媒体类型 @PostMapping(value = "/path", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_PLAIN_VALUE}) public ResponseEntity<Void> action(@RequestBody MyDto body) { // 直接使用DTO对象处理业务 System.out.println("Received name: " + body.getName()); return ResponseEntity.noContent().build(); } static class MyDto { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } }
为什么之前添加consumes = MediaType.TEXT_PLAIN_VALUE仍报错?
默认情况下,Spring的MappingJackson2HttpMessageConverter仅处理application/json等JSON相关媒体类型,不支持text/plain。所以即使你指定了consumes,Spring也无法将text/plain格式的内容转换为Object类型的请求体,导致抛出媒体类型不支持的错误。上述两种方案分别通过手动转换或扩展转换器解决了这个问题。
内容的提问来源于stack exchange,提问作者Youcef LAIDANI
相关产品推荐
相关产品推荐

