StringHttpMessageConverter vs. MappingJackson2HttpMessageConverter 对比详解
1. 基本概念
转换器 | 功能 |
---|---|
StringHttpMessageConverter | 处理纯文本内容(如 text/plain ),直接读写字符串。 |
MappingJackson2HttpMessageConverter | 基于 Jackson 库,处理 JSON 格式(如 application/json ),序列化/反序列化 Java 对象。 |
2. 核心区别
对比维度 | StringHttpMessageConverter | MappingJackson2HttpMessageConverter |
---|---|---|
处理内容类型 | text/plain (纯文本) | application/json (JSON 格式) |
数据类型 | 字符串(String ) | Java 对象(如 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
- 工作流程:
- 将
String
直接写入响应体。 - 支持字符编码(默认
UTF-8
)。
- 将
- 代码示例(自定义编码):
@Bean public StringHttpMessageConverter stringConverter() { StringHttpMessageConverter converter = new StringHttpMessageConverter(); converter.setWriteAcceptCharset(false); // 禁用 charset 参数 converter.setDefaultCharset(StandardCharsets.ISO_8859_1); return converter; }
MappingJackson2HttpMessageConverter
- 工作流程:
- 使用
ObjectMapper
将对象序列化为 JSON。 - 反向解析 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 默认按以下顺序选择转换器:
MappingJackson2HttpMessageConverter
(处理 JSON)StringHttpMessageConverter
(处理文本)
- 冲突场景:若返回
String
但 Content-Type 为application/json
,Jackson 转换器会尝试序列化字符串,导致错误。
- Spring MVC 默认按以下顺序选择转换器:
- 解决方式:
- 显式设置 Content-Type:
@GetMapping("/text") public ResponseEntity<String> getText() { return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) // 强制使用文本类型 .body("Hello"); }
- 显式设置 Content-Type:
6. 总结表格
对比项 | StringHttpMessageConverter | MappingJackson2HttpMessageConverter |
---|---|---|
核心功能 | 纯文本的读写 | JSON 格式的序列化与反序列化 |
数据类型 | String | Java 对象(依赖 Jackson) |
Content-Type | text/plain | application/json |
适用场景 | 返回简单文本或处理文本请求 | REST API、复杂对象的 JSON 交互 |
依赖库 | 无 | Jackson(jackson-databind ) |
典型返回值 | "Hello World" | { "name": "John", "age": 30 } |
关键总结
- 选择原则:
- 返回纯文本时用
StringHttpMessageConverter
。 - 处理 JSON 数据时用
MappingJackson2HttpMessageConverter
。
- 返回纯文本时用
- 注意事项:
- 确保 Content-Type 与转换器匹配,避免序列化冲突。
- 自定义配置时,通过
ObjectMapper
可灵活控制 JSON 格式。