springboot 消息转换器
阅读数:106 评论数:0
跳转到新版页面分类
python/Java
正文
一、消息转换器
在使用SpringMVC框架时,由前端发请求给后端,请求体中的内容就被称为消息。消息转换器就是实现消息与Java对象的相互转换,将请求体中的消息转为Java对象,反过来将Java对象转为响应体中的消息,所以其实SpringMVC中的@RequestBody和@ResponseBody注解就是干的这个事。
二、默认的消息转换器
在SpringBoot项目中由于导入了web-start依赖,在org.springframework.web.servlet.config.annotation包下面的WebMvcConfigurationSupport类,在这个下面有个addDefaultHttpMessageConverters方法就是设置默认的消息转换器集合。
protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
messageConverters.add(new ByteArrayHttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
messageConverters.add(new ResourceHttpMessageConverter());
messageConverters.add(new ResourceRegionHttpMessageConverter());
if (!shouldIgnoreXml) {
try {
messageConverters.add(new SourceHttpMessageConverter());
} catch (Throwable var3) {
}
}
messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if (romePresent) {
messageConverters.add(new AtomFeedHttpMessageConverter());
messageConverters.add(new RssChannelHttpMessageConverter());
}
Jackson2ObjectMapperBuilder builder;
if (!shouldIgnoreXml) {
if (jackson2XmlPresent) {
builder = Jackson2ObjectMapperBuilder.xml();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
} else if (jaxb2Present) {
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
}
if (kotlinSerializationJsonPresent) {
messageConverters.add(new KotlinSerializationJsonHttpMessageConverter());
}
if (jackson2Present) {
builder = Jackson2ObjectMapperBuilder.json();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
} else if (gsonPresent) {
messageConverters.add(new GsonHttpMessageConverter());
} else if (jsonbPresent) {
messageConverters.add(new JsonbHttpMessageConverter());
}
if (jackson2SmilePresent) {
builder = Jackson2ObjectMapperBuilder.smile();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
}
if (jackson2CborPresent) {
builder = Jackson2ObjectMapperBuilder.cbor();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
}
}
MappingJackson2HttpMessageConverter | 利用Jackson读写json格式数据 |
MappingJackson2HttpMessageConverter | 读写form表单数据 |
Jaxb2RootElementHttpMessageConverter | 使用jaxb读写xml格式数据 |
ByteArrayHttpMessageConverter | 读写二进制格式数据 |
StringHttpMessageConverter | 读写字符串格式数据 |
ResourceHttpMessageConverter | 读写资源文件数据 |
SourceHttpMessageConverter | 读写资源数据 |
三、SpringBoot配置自定义消息转换器
首先明白,因为是基于SpringBoot进行配置,所以配置都是基于配置类进行配置,配置消息转换器是在WebMvcConfigure接口实现类中重写configureMessageConverters、或者是重写extendMessageConverters方法。
1、注册fastjson消息转换器
@Bean
public HttpMessageConverter fastJsonHttpMessageConverters() {
//1.使用FastJson消息转换器对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2.创建FastJson配置类对象
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//3.通过配置类对象设置属性
//"PrettyFormat"特性可以使得输出的JSON格式具有良好的可读性,即每个属性都单独占据一行,
// 而不是将整个JSON字符串打印在一行中。这样做可以让JSON数据更加易读,方便人工阅读和调试
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//设置日期格式
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
//将Long类型数据转为字符串
SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);
//为FastJson添加序列化配置实例
fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
//将FastJson配置添加到fastJSON消息转换器中
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return converter;
}
ToStringSerializer | 转换为字符串 |
LongCodec | 将Long类型的数据序列化为数字形式,默认的Long序列化方式。 |
JSONAwareSerializer | 将实现了JSONAware接口的Java对象序列化为字符串形式 |
MapSerializer | 将Map类型的数据序列化为JSON对象。 |
ListSerializer | 将List类型的数据序列化为JSON数组。 |
ArraySerializer | 将数组类型的数据序列化为JSON数组。 |
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//将fastJson消息转换器添加到消息转换器集合中
converters.add(fastJsonHttpMessageConverters());
}
2、configureMessageConverters与extendMessageConverters不同
前者会覆盖掉原有的消息转换器集合,而只保留当前的集合。
相关推荐
一、概述
Spring 中的处理器的实现多变,比如用户的处理器可以实现 Controller 接口或者 HttpRequestHandler 接口,也可以用 @RequestMapping 注解将方法