{{format('0')}} {{format('357')}} {{format('4789')}}

记录一下 SpringBoot2.1.4 重写WebSocketConfigurer类下的configureMessageConverters()方法导致Content type 'application/json;charset=UTF-8' not supported的问题 [ 技术杂谈 ]

九叶的小窝 文章 正文

As Long As You Love Me.
分享

九叶

{{nature("2022-05-17 16:29:34")}}更新

1. 问题

由于以前开发人员开发websocket相关模块的时候 继承了 WebSocketConfigurer 类, 重写了该类下面的 configureMessageConverters()方法 作用是解决响应头的content-typeUTF-8

接下来看代码

public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
    /**
    * @Author: JiuyeXD
    * @Date: 2022/4/7 11:32
    * @Description: TODO 详情转到 {@link ai.config.WebAppConfig}
    */
    @Bean
    public HttpMessageConverter<String> responseBodyConverter() {
        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        return converter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        converters.add(responseBodyConverter());
    }
}

后来注释了该段代码后发现返回的响应头变成了 ISO 然后中文字符全部变成了?

image.png

2. 解决

参考记一次 SpringBoot2.x 配置 Fastjson 的坑的经验

新继承了WebMvcConfigurationSupport类 重写了下面的几个方法

一并处理了字符集还有日期格式还有Long长度大于17位时会出现精度丢失的问题

import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.alibaba.fastjson.support.spring.messaging.MappingFastJsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.List;

/**
 * <p>
 * WebAppConfig - webapp配置
 * TODO 解决 {@link ai.websocket.WebSocketConfig} 产生的 {@link org.springframework.web.bind.annotation.RequestBody} 注解失效的问题
 * </p>
 *
 * @author JiuyeXD
 * @version 1.0
 * @since 2022/4/7
 */
@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {

    @Bean
    public HttpMessageConverter<String> responseBodyConverter() {
        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        return converter;
    }

    /**
     * @Author: JiuyeXD
     * @Date: 2022/4/7 11:30
     * @Description: TODO 定义一个convert转换消息的对象
     * @return {@link MappingFastJsonMessageConverter}
     */
    public FastJsonHttpMessageConverter messageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        /* 添加fastjson的配置信息 */
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                //全局修改日期格式,如果时间是data、时间戳类型,按照这种格式初始化时间 "yyyy-MM-dd HH:mm:ss"
                SerializerFeature.WriteDateUseDateFormat,
                // 保留map空的字段
                SerializerFeature.WriteMapNullValue,
                // 将String类型的null转成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 将Number类型的null转成0
                SerializerFeature.WriteNullNumberAsZero,
                // 将List类型的null转成[]
                SerializerFeature.WriteNullListAsEmpty,
                // 将Boolean类型的null转成false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 避免循环引用
                SerializerFeature.DisableCircularReferenceDetect);

        /* 配置属性拦截 将数字类型转为String传给前台防止数据精度丢失 */
        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
        serializeConfig.put(Long.class, ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
        fastJsonConfig.setSerializeConfig(serializeConfig);

        /* 在convert中添加配置信息 */
        converter.setFastJsonConfig(fastJsonConfig);
        return converter;
    }

    /**
     * @Author: JiuyeXD
     * @Date: 2022/4/7 11:31
     * @Description: TODO 解决中文乱码
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(responseBodyConverter());
        super.configureMessageConverters(converters);
        /* 定义一个convert转换消息的对象 */
        converters.add(messageConverter());
        /* 追加默认转换器 注:很重要否则不支持其他类型的请求 */
        super.addDefaultHttpMessageConverters(converters);
    }
}
评论 0
0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}
TOP 2
Minecraft | [1.12.2] 核电工艺模拟器 1.2.25 —— 汉化版

{{nature('2021-12-07 15:29:00')}} {{format('2439')}}人已阅读

TOP 3
SSM搭建Spring单元测试环境

{{nature('2021-01-31 20:01:00')}} {{format('1044')}}人已阅读

TOP 4
dispatcher-servlet.xml文件配置模板

{{nature('2020-12-11 21:17:00')}} {{format('959')}}人已阅读

TOP 5
Windows平台Nacos启动报错无法创建Bean实例

{{nature('2021-04-22 15:16:00')}} {{format('938')}}人已阅读

目录

标签云

Java SpringBoot

一言

# {{hitokoto.data.from || '来自'}} #
{{hitokoto.data.hitokoto || '内容'}}
作者:{{hitokoto.data.from_who || '作者'}}
自定义UI
配色方案

侧边栏