spring mvc中 StringHttpMessageConverter vs. MappingJackson2HttpMessageConverter 对比详解


StringHttpMessageConverter vs. MappingJackson2HttpMessageConverter 对比详解


1. 基本概念
转换器功能
StringHttpMessageConverter处理纯文本内容(如 text/plain),直接读写字符串。
MappingJackson2HttpMessageConverter基于 Jackson 库,处理 JSON 格式(如 application/json),序列化/反序列化 Java 对象。

2. 核心区别
对比维度StringHttpMessageConverterMappingJackson2HttpMessageConverter
处理内容类型text/plain(纯文本)application/json(JSON 格式)
数据类型字符串(StringJava 对象(如 Map, POJO, List 等)
序列化/反序列化直接读写字符串,无格式转换将对象转换为 JSON 字符串,或 JSON 转换为对象(依赖 Jackson)
依赖库无(Spring 内置)Jackson 库(如 jackson-databind
适用场景返回纯文本响应或处理文本请求处理 RESTful API 的 JSON 数据交互

3. 典型使用场景
StringHttpMessageConverter
  • 场景:直接返回纯文本内容(如提示信息、日志等)。

  • 示例代码

    @RestController
    public class TextController {
        @GetMapping("/text")
        public String getText() {
            return "Hello, this is plain text!";
        }
    }
    

    响应

    Hello, this is plain text!
    
MappingJackson2HttpMessageConverter
  • 场景:返回 JSON 格式的复杂数据(如对象、集合等)。

  • 示例代码

    @RestController
    public class JsonController {
        @GetMapping("/json")
        public User getUser() {
            return new User("John", 25); // User 是一个 POJO
        }
    }
    

    响应

    {
        "name": "John",
        "age": 25
    }
    

4. 关键实现细节
StringHttpMessageConverter
  • 工作流程
    1. String 直接写入响应体。
    2. 支持字符编码(默认 UTF-8)。
  • 代码示例(自定义编码):
    @Bean
    public StringHttpMessageConverter stringConverter() {
        StringHttpMessageConverter converter = new StringHttpMessageConverter();
        converter.setWriteAcceptCharset(false); // 禁用 charset 参数
        converter.setDefaultCharset(StandardCharsets.ISO_8859_1);
        return converter;
    }
    
MappingJackson2HttpMessageConverter
  • 工作流程
    1. 使用 ObjectMapper 将对象序列化为 JSON。
    2. 反向解析 JSON 为对象(如处理 @RequestBody)。
  • 配置示例(自定义 Jackson 行为):
    @Bean
    public MappingJackson2HttpMessageConverter jsonConverter() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 值
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用时间戳格式
        return new MappingJackson2HttpMessageConverter(mapper);
    }
    

5. 冲突与优先级
  • 默认优先级
    • Spring MVC 默认按以下顺序选择转换器:
      1. MappingJackson2HttpMessageConverter(处理 JSON)
      2. StringHttpMessageConverter(处理文本)
    • 冲突场景:若返回 String 但 Content-Type 为 application/json,Jackson 转换器会尝试序列化字符串,导致错误。
  • 解决方式
    • 显式设置 Content-Type:
      @GetMapping("/text")
      public ResponseEntity<String> getText() {
          return ResponseEntity.ok()
                  .contentType(MediaType.TEXT_PLAIN) // 强制使用文本类型
                  .body("Hello");
      }
      

6. 总结表格
对比项StringHttpMessageConverterMappingJackson2HttpMessageConverter
核心功能纯文本的读写JSON 格式的序列化与反序列化
数据类型StringJava 对象(依赖 Jackson)
Content-Typetext/plainapplication/json
适用场景返回简单文本或处理文本请求REST API、复杂对象的 JSON 交互
依赖库Jackson(jackson-databind
典型返回值"Hello World"{ "name": "John", "age": 30 }

关键总结

  • 选择原则
    • 返回纯文本时用 StringHttpMessageConverter
    • 处理 JSON 数据时用 MappingJackson2HttpMessageConverter
  • 注意事项
    • 确保 Content-Type 与转换器匹配,避免序列化冲突。
    • 自定义配置时,通过 ObjectMapper 可灵活控制 JSON 格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱的叹息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值