自定义configureMessageConverters和ObjectMapper解决json序列化问题实例
生活随笔
收集整理的這篇文章主要介紹了
自定义configureMessageConverters和ObjectMapper解决json序列化问题实例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
configureMessageConverters:
覆蓋此方法以添加自定義 HttpMessageConverters 以與 RequestMappingHandlerAdapter 和 ExceptionHandlerExceptionResolver 一起使用。將轉(zhuǎn)換器添加到列表會關(guān)閉默認(rèn)情況下會注冊的默認(rèn)轉(zhuǎn)換器。另請參閱 addDefaultHttpMessageConverters 以添加默認(rèn)消息轉(zhuǎn)換器。
代碼:自定義 WebMvcConfigurationSupport:
package com.itheima.pinda.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.DateSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; @Slf4j @Configuration @EnableSwagger2 public class ConfigurationSupport extends WebMvcConfigurationSupport {/*** deserializerByType 解決string類型入?yún)⑥D(zhuǎn)為 LocalDateTime 格式問題** @return*///ackson2ObjectMapperBuilderCustomizer:希望通過保留其默認(rèn)自動配置的Jackson2ObjectMapperBuilder進(jìn)一步自定義ObjectMapper的 bean 可以實(shí)現(xiàn)回調(diào)接口。@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> builder// .deserializerByType(Enum.class, EnumDeserializer.INSTANCE).deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))).deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))).deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));}/*** 防止@EnableMvc把默認(rèn)的靜態(tài)資源路徑覆蓋了,手動設(shè)置的方式** @param registry*/@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {// 解決靜態(tài)資源無法訪問registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");// 解決swagger無法訪問registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");// 解決swagger的js文件無法訪問registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}/*** 解決序列化*///配置HttpMessageConverters以用于讀取或?qū)懭胝埱蠡蝽憫?yīng)的主體。如果未添加轉(zhuǎn)換器,則會注冊轉(zhuǎn)換器的默認(rèn)列表。@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("初始化jackson配置( 枚舉類型、時(shí)間格式 )");//在json轉(zhuǎn)換之前先進(jìn)行string轉(zhuǎn)換converters.add(new StringHttpMessageConverter());//添加json轉(zhuǎn)換MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();jackson2HttpMessageConverter.setObjectMapper(new JacksonObjectMapper());converters.add(jackson2HttpMessageConverter);//追加默認(rèn)轉(zhuǎn)換器super.addDefaultHttpMessageConverters(converters);}protected static final String DEFAULT_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss";protected static final String DEFAULT_DATE_FORMAT= "yyyy/MM/dd";protected static final String DEFAULT_TIME_FORMAT= "HH:mm:ss";class JacksonObjectMapper extends ObjectMapper {//ObjectMapper 提供了讀取和寫入 JSON 的功能,無論是從基本 POJO(Plain Old Java Objects)// 還是從通用 JSON 樹模型 ( JsonNode ) 讀取和寫入,以及執(zhí)行轉(zhuǎn)換的相關(guān)功能。// 它也是高度可定制的,既可以處理不同風(fēng)格的 JSON 內(nèi)容,也可以支持更高級的對象概念,// 例如多態(tài)性和對象標(biāo)識。 ObjectMapper還充當(dāng)更高級的ObjectReader和ObjectWriter類的工廠public JacksonObjectMapper() {super();//收到未知屬性時(shí)不報(bào)異常 public static final DeserializationFeature FAIL_ON_UNKNOWN_PROPERTIESthis.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);//反序列化時(shí),屬性不存在的兼容處理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //com.fasterxml.jackson.databind.module public class SimpleModuleSimpleModule simpleModule = new SimpleModule()//addSerializer添加序列化程序以處理特定類型值的方法。.addSerializer(BigInteger.class, ToStringSerializer.instance).addSerializer(BigDecimal.class, new BigDecimalSerializer()).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))).addSerializer(Date.class, new DateSerializer(false, new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT)));this.registerModule(simpleModule);}} } 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的自定义configureMessageConverters和ObjectMapper解决json序列化问题实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剪枝算法】通过网络瘦身学习高效的卷积网
- 下一篇: Quartz详解和使用CommandLi