优雅处理枚举&前端丢失大Long精度问题

1. 枚举-json处理(前端 <=> 后端 <=> 数据库)

前端传递 枚举code
后端响应 枚举code
表里存储 枚举code
内存处理 枚举对象

@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexEnum {

    MALE(0, "男"),
    FEMALE(1, "女"),
    UNKNOWN(2, "未知");

    /**
     * 前端传递不存在的枚举code,报400错误(起到规范作用)
     */
    
    @JsonValue  // 告诉jackson 返回json时,使用这个属性
    @EnumValue  // 告诉mybatis-plus 这个枚举在数据库中保存为这个字段的值
    private final int code;
    private final String desc;
}
    /**
     * 用户性别(0男 1女 2未知)
     */
    @TableField(value = "sex")
    private SexEnum sex;	// 表里是int类型,实体类字段用枚举类型封装

yml:

mybatis-plus:
  type-enums-package: com.example.demo.guigu.enums

2. 枚举-mapper.xml

mapper.xml 中,直接使用 枚举对象.code 进行判断

List<SysUser> getEnumeData(@Param("se") SexEnum sexEnum);
<select id="getEnumeData" resultType="com.atguigu.admin.entity.SysUser">
    select * from sys_user where sex = #{se.code}
</select>

3. 前端丢失大Long精度问题

问题描述:表里的主键如果是大Long,后端用Long包装并返回给前端,前端收到的Long会丢失精度
解决办法:后端统一把Long转成String再返回给前端

// 统一将 Long 类型序列化为 String
@Configuration
public class JacksonConfiguration {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            // 把 Long 类型序列化为 String
            builder.serializerByType(Long.class, ToStringSerializer.instance);
        };
    }
}
@Component
public class LongToStringConverter extends JsonSerializer<Long> {

    @Override
    public void serialize(Long aLong, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(aLong.toString());
    }
}

如若此做,后端响应给前端的json里原本Long类型的字段全变成字符串

讲解视频:https://www.bilibili.com/video/BV1dE421P7y5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值