消息转换器是Spring MVC中非常有用的特性,它简化了处理不同数据格式的请求和响应的过程。
当客户端(例如浏览器)向服务器发送请求时,服务器需要将请求消息转换成服务器应用程序可以理解的形式,同样当服务器向客户端发送响应时,服务器应用程序需要将响应消息转换成客户端可以理解的形式。Spring MVC 使用消息转换器(Message Converter)来完成请求消息和响应消息的转换过程。
消息转换器是Spring MVC框架中的一种功能强大的机制,它可以将HTTP请求和响应中的消息体与Java对象之间进行转换。具体来说,它可以将请求消息中的数据(例如JSON、XML、form表单等)转换成Java对象,并将Java对象转换成响应消息中的数据。
Spring MVC支持多种消息转换器,每种转换器负责实现特定的数据格式转换。以下是一些常见的消息转换器:
下面是一个示例,演示如何在Spring MVC中添加自定义消息转换器:
- StringHttpMessageConverter:将请求消息和响应消息转换成String类型。
- MappingJackson2HttpMessageConverter:将JSON数据与Java对象之间进行转换,使用Jackson库实现。
- MappingJackson2XmlHttpMessageConverter:将XML数据与Java对象之间进行转换,使用Jackson库实现。
- FormHttpMessageConverter:将表单数据与Java对象之间进行转换,支持application/x-www-form-urlencoded和multipart/form-data格式。
- ByteArrayHttpMessageConverter:将字节数组与Java对象之间进行转换。
- Jaxb2RootElementHttpMessageConverter:将XML数据与Java对象之间进行转换,使用JAXB库实现。
-
在Spring MVC中,消息转换器在处理请求和响应时自动触发。当请求到达控制器方法时,Spring MVC会检查请求中的Content-Type,并查找适合该Content-Type的消息转换器进行转换。同样,当控制器方法返回响应时,Spring MVC会根据客户端请求的Accept头部信息,查找适合的消息转换器将Java对象转换成响应消息的数据格式。
你可以通过以下方式自定义消息转换器:
- 注册自定义的转换器:在Spring MVC配置文件或Java配置中注册自定义的消息转换器。
- 修改默认转换器列表:可以通过修改WebMvcConfigurer的configureMessageConverters方法来修改默认的消息转换器列表。
-
/** * 扩展Spring MVC框架的消息转化器 * @param converters */ @Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { log.info("扩展消息转换器..."); //创建一个消息转换器对象 MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据 converter.setObjectMapper(new JacksonObjectMapper()); //将自己的消息转化器加入容器中 converters.add(0,converter); } }
对象类
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
//public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
super();
//收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//注册功能模块 例如,可以添加自定义序列化器和反序列化器
this.registerModule(simpleModule);
}
}