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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:40:41