springmvc 升 springboot @JSONField不生效,或者fastjson 相关的注解不生效

1 自定义FastJsonHttpMessageConverter替换springboot 自带的MappingJackson2HttpMessageConverter



import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class WebContextConfiguration implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        /*添加fastjson*/
        converters.add(0,fastJsonHttpMessageConverters(converters));
    }

    /**
     * 定义fastjson替代jackson,
     *
     * @return
     */
    private HttpMessageConverter fastJsonHttpMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.remove(i);
            }
            if (converters.get(i) instanceof FastJsonHttpMessageConverter) {
                converters.remove(i);
            }
        }
        /*自定义fastjson配置*/
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(Charset.forName("UTF-8"));
        config.setSerializerFeatures(
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.QuoteFieldNames,
                SerializerFeature.WriteDateUseDateFormat

        );

        fastJsonHttpMessageConverter.setFastJsonConfig(config);
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.TEXT_HTML);
        fastMediaTypes.add(MediaType.APPLICATION_JSON);
        fastMediaTypes.add(MediaType.APPLICATION_XML);
        fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        fastMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        return fastJsonHttpMessageConverter;
    }
}

2:如果是新建的springboot 项目,通过第一步的配置,自定义消息转换器已经生效了, 但是如果原先是springmvc 项目升级到springboot的且在xml 文件中有配置mvc:annotation-driven则可能没有生效(通过断点观察到配置成功了但是没起作用)。 原因在于mvc:annotation-driven 中先加载了RequestMappingHandlerAdapter, 但是这时刚配置的消息转换器还没有加载。通过跟踪源码会发现RequestMappingHandlerAdapter先后加载了两次,第二次才加载我们配置的那个转换器, 第一次走的是默认的转换器。通过跟踪 returnValueHandlers、RequestResponseBodyMethodProcessor 可以发现第一次加载时 getMessageConverters() 取到的是springboot默认的那几个转换器。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3:由springmvc 项目升级到springboot的且在xml 文件中有配置mvc:annotation-driven, 只需要删除所有mvc:annotation-driven 的配置, 自定义的转换器即可生效。

// 需要删掉它 不然自定义的消息转换器不起作用
<mvc:annotation-driven />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值