Spring MVC 自定义MessageConverter消息转换器
HttpMessageConverter 接口定义了 HTTP 请求体到 Java 对象、Java 对象到响应体的转换规则。
接口定义
Java
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, MediaType mediaType);
boolean canWrite(Class<?> clazz, MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
T read(Class<? extends T> clazz, HttpInputMessage inputMessage);
void write(T t, MediaType contentType, HttpOutputMessage outputMessage);
}
核心方法说明
| 方法 | 作用 |
|---|---|
| canRead | 判断是否可读取请求体 |
| canWrite | 判断是否可写入响应体 |
| read | 将请求体转为对象 |
| write | 将对象写入响应体 |
自定义消息转换器
Java
public class PropertiesMessageConverter extends AbstractGenericHttpMessageConverter<Properties> {
public PropertiesMessageConverter() {
super(new MediaType("text", "properties"));
}
@Override
protected Properties readInternal(Class<? extends Properties> clazz,
HttpInputMessage inputMessage) throws IOException {
Properties props = new Properties();
props.load(inputMessage.getBody());
return props;
}
@Override
protected void writeInternal(Properties props, HttpOutputMessage outputMessage)
throws IOException {
props.store(outputMessage.getBody(), "Generated by Custom Converter");
}
@Override
protected boolean supports(Class<?> clazz) {
return Properties.class.isAssignableFrom(clazz);
}
}
注册自定义转换器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(0, new PropertiesMessageConverter());
}
}
内置转换器
| 转换器 | 支持类型 |
|---|---|
| StringHttpMessageConverter | text/plain, text/html |
| MappingJackson2HttpMessageConverter | application/json |
| ByteArrayHttpMessageConverter | application/octet-stream |
| FormHttpMessageConverter | application/x-www-form-urlencoded |
使用 extendMessageConverters 追加转换器,configureMessageConverters 会覆盖默认转换器。
要点总结
- canRead/canWrite 决定转换器是否生效
- MediaType 匹配 Content-Type 和 Accept 头
- 转换器顺序影响匹配优先级
- 可继承 AbstractGenericHttpMessageConverter 简化实现
📝 发现内容有误?点击此处直接编辑