1.拓展消息转换器
1.1要点:
- 实现WebMvcConfigurer接口
- 重写extendMessageConverters方法
- 并将自定义的消息转化器添加到第一个
示例代码如下:
/**
* 编写一个对象映射器, 继承ObjectMapper类(提供一些基本的消息转换器,用于处理常见的数据类型和格式)
* 对象映射器:基于jackson将Java对象转为json, 或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public JacksonObjectMapper () {
super();
// 收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
// 反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
// 反序列化(如果需要还可以继续加)
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
// 序列化(如果需要还可以继续加)
// Long类型转换成String类型,JavaScript对于Long类型的处理只有16位,会丢失精度
.addSerializer(Long.class, ToStringSerializer.instance)
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
this.registerModule(simpleModule);
}
}
Web配置类
/**
* WebMvc配置类
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setObjectMapper(new JacksonObjectMapper());
// 这里需要将添加的消息转换器放到第一位,因为会很多默认的消息转换器,如果被前面的转换器匹配上了,就不会再走后面的转换器了
converters.add(0, messageConverter);
}
}
2.自己定义消息转换器,不使用默认的自动配置
2.1要点:
- 实现WebMvcConfigurer接口
- 重写configureMessageConverters方法
- 在类上添加@EnableWebMvc注解
对象映射器与上面一样,不再重复
/**
* WebMvc配置类
*/
@EnableWebMvc
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 1.定义一个新的converter
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
// 2.定义转换mapper
ObjectMapper objectMapper = new JacksonObjectMapper();
messageConverter.setObjectMapper(objectMapper);
// 因为在类上加了@EnableWebMvc注解,表示自己接管Mvc的配置,默认的配置都没了,也就是说现在converters里只有下面两个转换器
converters.add(messageConverter);
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
}
}
注意事项:@EnableWebMvc表示完全自己控制mvc配置,也就是说所有配置都需要自己重写,所有默认配置都没了!有时会导致很多请求进不来,或者参数转换出错之类的,所以在大多数情况下使用第一种方案就好。