springboot使用fastjson做实体类字段转化时失效

情景回顾

以前遇到这种实体类的1, 2转为男, 女这种业务一般都是配置字典然后前端就直接读字典解析了, 几乎没咋用过在java代码中解析, 偶尔实在要用可能就是直接代码里面自己解析一下返回前端, 并没有考虑使用fastjson或者jackjson解决

今天闲的没事就想要fastjson解决一下, 无非就是新建一个类实现一个接口重写一个方法然后把转化逻辑写进去, 最后在实体类加一个注解把这个类的class写进去, 都是老套路了, 没啥意思, 这么没啥意思的东西让我搞了一个小时, 真坑!!!

干前准备

fastjson依赖坐标

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.39</version>
        </dependency>

老套路办法

  1. 首先先写一个GenderSerializer, 都是老套路
public class GenderSerializer implements ObjectWriter<String> {

    @Override
    public void write(JSONWriter writer, Object object, Object fieldName, Type fieldType, long features) {
        if (object == null) {
            writer.writeString("未知");
            return;
        }
        String gender = object.toString();
        switch (gender) {
            case "1":
                writer.writeString("男");
                break;
            case "2":
                writer.writeString("女");
                break;
            default:
                writer.writeString("未知");
        }
    }
}
  1. 在实体类给gender字段加注解@JSONField(serializeUsing = GenderSerializer.class)
@Data
@TableName("user")
public class User implements Serializable {
    /*
     * 主键(自增)
     */
    private int id;
    /*
     * 用户名
     */
    private String username;
    /*
     * 密码
     */
    private String password;
    /*
     * 性别
     */
    @JSONField(serializeUsing = GenderSerializer.class)
    private String gender;
}

遇到问题

到这里其实已经完事了, 直接调接口测试, 发现居然并没有解析为男,女, 还是返回字符串1,2

解决问题

在GenderSerializer 中的write方法内打断点, 发现没有进入直接返回, 当然返回的数据是字符串1,2
试了各种方法都不行呢, 苦恼!!!

网上说不直接返回User对象, 使用JSON.toJSONString(user)方法手动序列化为String类型可以解析, 试了一下果然可以, 但是我肯定不能反悔String啊, 我要返回对象, 我要对象, 唉!

然后我就搜啊, 边搜边试…

居然是因为

Spring MVC 默认使用 Jackson 作为 JSON 序列化器,而 @JSONField(serializeUsing = GenderSerializer.class) 是 FastJSON 的注解,只对 FastJSON 生效,对 Jackson 无效

有点坑爹, 但到此问题也就已经解决了
前面的代码不用动, 只需要强制 Spring MVC 使用 FastJSON就可以了, 配置如下:

@Configuration
public class FastJsonConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 1. 移除默认的 Jackson 转换器
        converters.removeIf(converter -> converter instanceof org.springframework.http.converter.json.MappingJackson2HttpMessageConverter);

        // 2. 添加 FastJSON2 转换器
        FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
        converters.add(fastJsonConverter);
    }
}

坑爹, 下课!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值