• spring-boot2.x,使用EnableWebMvc注解导致的自定义HttpMessageConverters不可用


    json对象转换方面,springboot默认使用的是MappingJackson2HttpMessageConverter。常规需求,在工程中使用阿里的FastJson作为json对象的转换器。

    FastJson SerializerFeatures

    WriteNullListAsEmpty  :List字段如果为null,输出为[],而非null
    WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
    DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
    WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
    WriteMapNullValue:是否输出值为null的字段,默认为false。

    1. public enum SerializerFeature {
    2. QuoteFieldNames,
    3. UseSingleQuotes,
    4. WriteMapNullValue,
    5. WriteEnumUsingToString,
    6. WriteEnumUsingName,
    7. UseISO8601DateFormat,
    8. WriteNullListAsEmpty,
    9. WriteNullStringAsEmpty,
    10. WriteNullNumberAsZero,
    11. WriteNullBooleanAsFalse,
    12. SkipTransientField,
    13. SortField,
    14. /** @deprecated */
    15. @Deprecated
    16. WriteTabAsSpecial,
    17. PrettyFormat,
    18. WriteClassName,
    19. DisableCircularReferenceDetect,
    20. WriteSlashAsSpecial,
    21. BrowserCompatible,
    22. WriteDateUseDateFormat,
    23. NotWriteRootClassName,
    24. /** @deprecated */
    25. DisableCheckSpecialChar,
    26. BeanToArray,
    27. WriteNonStringKeyAsString,
    28. NotWriteDefaultValue,
    29. BrowserSecure,
    30. IgnoreNonFieldGetter,
    31. WriteNonStringValueAsString,
    32. IgnoreErrorGetter,
    33. WriteBigDecimalAsPlain,
    34. MapSortField;
    35. }

    使用FastJson,有两种常规操作。

    一、注入bean的方式,这种方法加入的转换器排序是第一位

    1. package com.gaoshan.verification.config;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.http.converter.HttpMessageConverter;
    4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    5. import java.util.List;
    6. @Configuration
    7. public class WebMvcConfigurerConfig implements WebMvcConfigurer {
    8. @Override
    9. public void extendMessageConverters(List> converters) {
    10. for (HttpMessageConverter messageConverter : converters) {
    11. System.out.println("======================"+messageConverter);
    12. }
    13. }
    14. }
    1. package com.gaoshan.verification.config;
    2. import com.alibaba.fastjson.serializer.SerializerFeature;
    3. import com.alibaba.fastjson.support.config.FastJsonConfig;
    4. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    5. import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
    6. import org.springframework.context.annotation.Bean;
    7. import org.springframework.context.annotation.Configuration;
    8. import org.springframework.http.MediaType;
    9. import java.util.ArrayList;
    10. import java.util.List;
    11. @Configuration
    12. public class MessageConvertConfig {
    13. @Bean
    14. public HttpMessageConverters fastJsonHttpMessageConverters() {
    15. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    16. FastJsonConfig fastJsonConfig = new FastJsonConfig();
    17. fastJsonConfig.setSerializerFeatures(
    18. SerializerFeature.PrettyFormat,
    19. SerializerFeature.DisableCircularReferenceDetect,
    20. SerializerFeature.WriteBigDecimalAsPlain,
    21. SerializerFeature.WriteMapNullValue);
    22. fastConverter.setFastJsonConfig(fastJsonConfig);
    23. List supportedMediaTypes = new ArrayList<>();
    24. supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    25. fastConverter.setSupportedMediaTypes(supportedMediaTypes);
    26. return new HttpMessageConverters(fastConverter);
    27. }
    28. }

    ======================com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@2c5708e7
    ======================org.springframework.http.converter.ByteArrayHttpMessageConverter@4ffa078d
    ======================org.springframework.http.converter.StringHttpMessageConverter@4e26564d
    ======================org.springframework.http.converter.ResourceHttpMessageConverter@42238078
    ======================org.springframework.http.converter.ResourceRegionHttpMessageConverter@5627b8eb
    ======================org.springframework.http.converter.xml.SourceHttpMessageConverter@49fe0bcd
    ======================org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@3516b881
    ======================org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@6be8ce1b
    ======================org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@e3c36d

    二、实现WebMvcConfigurer接口,这种方法加入的转换器排序是最后一位

    1. package com.gaoshan.verification.config;
    2. import com.alibaba.fastjson.serializer.SerializerFeature;
    3. import com.alibaba.fastjson.support.config.FastJsonConfig;
    4. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    5. import org.springframework.context.annotation.Configuration;
    6. import org.springframework.http.MediaType;
    7. import org.springframework.http.converter.HttpMessageConverter;
    8. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    9. import java.util.ArrayList;
    10. import java.util.List;
    11. @Configuration
    12. public class WebMvcConfigurerConfig implements WebMvcConfigurer {
    13. @Override
    14. public void extendMessageConverters(List> converters) {
    15. for (HttpMessageConverter messageConverter : converters) {
    16. System.out.println("======================"+messageConverter);
    17. }
    18. }
    19. @Override
    20. public void configureMessageConverters(List> converters) {
    21. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    22. FastJsonConfig fastJsonConfig = new FastJsonConfig();
    23. fastJsonConfig.setSerializerFeatures(
    24. SerializerFeature.PrettyFormat,
    25. SerializerFeature.DisableCircularReferenceDetect,
    26. SerializerFeature.WriteBigDecimalAsPlain,
    27. SerializerFeature.WriteMapNullValue);
    28. fastConverter.setFastJsonConfig(fastJsonConfig);
    29. List supportedMediaTypes = new ArrayList<>();
    30. supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    31. fastConverter.setSupportedMediaTypes(supportedMediaTypes);
    32. converters.add(fastConverter);
    33. }
    34. }

     ======================org.springframework.http.converter.ByteArrayHttpMessageConverter@71f29d91
    ======================org.springframework.http.converter.StringHttpMessageConverter@6785df10
    ======================org.springframework.http.converter.StringHttpMessageConverter@6143b2b1
    ======================org.springframework.http.converter.ResourceHttpMessageConverter@a63643e
    ======================org.springframework.http.converter.ResourceRegionHttpMessageConverter@43294e9b
    ======================org.springframework.http.converter.xml.SourceHttpMessageConverter@26d24d7a
    ======================org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@5a78b52b
    ======================org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@144440f5
    ======================org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@4bab78ce
    ======================org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@42ffbab6
    ======================com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@7672960e

    注意:

    1、可以两种方式同时使用,这样可以达到目的,在转换器列表的头尾,都会出现FastJsonHttpMessageConverter

    ======================com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@2c5708e7
    ======================org.springframework.http.converter.ByteArrayHttpMessageConverter@4ffa078d
    ======================org.springframework.http.converter.StringHttpMessageConverter@4e26564d
    ======================org.springframework.http.converter.ResourceHttpMessageConverter@42238078
    ======================org.springframework.http.converter.ResourceRegionHttpMessageConverter@5627b8eb
    ======================org.springframework.http.converter.xml.SourceHttpMessageConverter@49fe0bcd
    ======================org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@3516b881
    ======================org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@6be8ce1b
    ======================org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@e3c36d
    ======================com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@397a10df

     

    2、不要乱加 @EnableWebMvc标签,这个标签会导致添加自定义消息转换器失败。因为时间问题,目前还不清楚具体原因

    • 针对方案一,启动类或任意配置类,加了@EnableWebMvc后,导致自定义的转换器没有出现在集合内,即添加自定义转换器失败
    1. package com.gaoshan.verification.config;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.http.converter.HttpMessageConverter;
    4. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    6. import java.util.List;
    7. @Configuration
    8. @EnableWebMvc
    9. public class WebMvcConfigurerConfig implements WebMvcConfigurer {
    10. @Override
    11. public void extendMessageConverters(List> converters) {
    12. for (HttpMessageConverter messageConverter : converters) {
    13. System.out.println("======================"+messageConverter);
    14. }
    15. }
    16. }
    1. package com.gaoshan.verification.config;
    2. import com.alibaba.fastjson.serializer.SerializerFeature;
    3. import com.alibaba.fastjson.support.config.FastJsonConfig;
    4. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    5. import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
    6. import org.springframework.context.annotation.Bean;
    7. import org.springframework.context.annotation.Configuration;
    8. import org.springframework.http.MediaType;
    9. import java.util.ArrayList;
    10. import java.util.List;
    11. @Configuration
    12. public class MessageConvertConfig {
    13. @Bean
    14. public HttpMessageConverters fastJsonHttpMessageConverters() {
    15. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    16. FastJsonConfig fastJsonConfig = new FastJsonConfig();
    17. fastJsonConfig.setSerializerFeatures(
    18. SerializerFeature.PrettyFormat,
    19. SerializerFeature.DisableCircularReferenceDetect,
    20. SerializerFeature.WriteBigDecimalAsPlain,
    21. SerializerFeature.WriteMapNullValue);
    22. fastConverter.setFastJsonConfig(fastJsonConfig);
    23. List supportedMediaTypes = new ArrayList<>();
    24. supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    25. fastConverter.setSupportedMediaTypes(supportedMediaTypes);
    26. return new HttpMessageConverters(fastConverter);
    27. }
    28. }

     ======================org.springframework.http.converter.ByteArrayHttpMessageConverter@42238078
    ======================org.springframework.http.converter.StringHttpMessageConverter@5627b8eb
    ======================org.springframework.http.converter.ResourceHttpMessageConverter@49fe0bcd
    ======================org.springframework.http.converter.ResourceRegionHttpMessageConverter@3516b881
    ======================org.springframework.http.converter.xml.SourceHttpMessageConverter@6be8ce1b
    ======================org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@e3c36d
    ======================org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@397a10df
    ======================org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@39a865c1

    • 针对方案二,启动类或任意配置类,加了@EnableWebMvc后,导致集合内仅有自定义转换器
    1. package com.gaoshan.verification.config;
    2. import com.alibaba.fastjson.serializer.SerializerFeature;
    3. import com.alibaba.fastjson.support.config.FastJsonConfig;
    4. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    5. import org.springframework.context.annotation.Configuration;
    6. import org.springframework.http.MediaType;
    7. import org.springframework.http.converter.HttpMessageConverter;
    8. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    9. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    10. import java.util.ArrayList;
    11. import java.util.List;
    12. @Configuration
    13. @EnableWebMvc
    14. public class WebMvcConfigurerConfig implements WebMvcConfigurer {
    15. @Override
    16. public void extendMessageConverters(List> converters) {
    17. for (HttpMessageConverter messageConverter : converters) {
    18. System.out.println("======================"+messageConverter);
    19. }
    20. }
    21. @Override
    22. public void configureMessageConverters(List> converters) {
    23. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    24. FastJsonConfig fastJsonConfig = new FastJsonConfig();
    25. fastJsonConfig.setSerializerFeatures(
    26. SerializerFeature.PrettyFormat,
    27. SerializerFeature.DisableCircularReferenceDetect,
    28. SerializerFeature.WriteBigDecimalAsPlain,
    29. SerializerFeature.WriteMapNullValue);
    30. fastConverter.setFastJsonConfig(fastJsonConfig);
    31. List supportedMediaTypes = new ArrayList<>();
    32. supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    33. fastConverter.setSupportedMediaTypes(supportedMediaTypes);
    34. converters.add(fastConverter);
    35. }
    36. }

    ======================com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter@1df06ecd

    • 启动类代码
      1. package com;
      2. import org.springframework.boot.SpringApplication;
      3. import org.springframework.boot.autoconfigure.SpringBootApplication;
      4. @SpringBootApplication
      5. public class VerificationApplication {
      6. public static void main(String[] args) {
      7. SpringApplication.run(VerificationApplication.class, args);
      8. }
      9. }
       
  • 相关阅读:
    Windows 性能突然打鸡血,靠 Bug 修复了多年顽疾
    【毕业设计】基于stm32的便携式U盘设计与实现 - stm32制作U盘
    疟原虫蛋白复合物疫苗科研
    Django【执行查询】(二)
    Go channel被关闭时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题
    c++的数据类型的引用(三种方式有一些区别)
    C#&Winform&ListView实现缺陷图片浏览器
    Meta 内部都在用的 FX 工具大起底:利用 Graph Transformation 优化 PyTorch 模型
    SpringBoot 创建非web工程——2种实现方法
    安全防御——防火墙一
  • 原文地址:https://blog.csdn.net/gaoshan12345678910/article/details/133070197