优化java枚举类在数据库持久化、前后端交互时的序列化使用方式

实体类持久化到数据库-枚举属性序列化

1.@EnumValue
2.配置
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

mybatis-plus:typeEnumsPackage: xxx
实体类中枚举属性自动转为@EnumValue标记的属性值

从数据库查实体类-枚举属性反序列化

1.@EnumValue
2.配置mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

mybatis-plus:typeEnumsPackage: xxx
数据库中属性值,自动转换为实体类中的枚举属性(对象)
在这里插入图片描述

服务端接口返回前端-枚举属性序列化

  • 1.@JsonSerialize(using = ToStringSerializer.class)
    实体类的枚举属性序列化为toString方法,可自定义返回json,如:
    { "code": 0, "msg": null, "data": { "id": null, "testEnum": "{code:1, desc:'a'}" } }
    注意testEnum的值是字符串
  • 2.@JsonFormat(shape = JsonFormat.Shape.OBJECT)
    import com.fasterxml.jackson.annotation.JsonFormat;
    在枚举类上使用此注解,返回前端的是json对象
    在这里插入图片描述

{ "code": 0, "msg": null, "data": { "id": null, "testEnum": { "code":1, "desc":'a' } } }
注意testEnum的值是json对象
返回json对象,前端接到后处理更方便,推荐此种方式

前端调用服务端接口-枚举属性反序列化

通过json传枚举值到接口中自动转换为对象的枚举属性
@RequestBody TestEnumEntity testEnumEntity
@JsonDeserialize(using = BaseEnumDeserializer.class)

附上代码:

  • 枚举公共接口
    在这里插入图片描述
  • 枚举
    在这里插入图片描述
  • 实体类
    在这里插入图片描述
  • 枚举反序列化器
public class BaseEnumDeserializer extends JsonDeserializer {

    @Override
    public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        JsonNode value = jsonParser.getCodec().readTree(jsonParser);
        String currentName = jsonParser.currentName();
        Object currentValue = jsonParser.getCurrentValue();
        Class findPropertyType = BeanUtils.findPropertyType(currentName, currentValue.getClass());
        if (findPropertyType.isEnum()) {
            BaseEnum[] enumConstants = (BaseEnum[]) findPropertyType.getEnumConstants();
            for (BaseEnum e : enumConstants) {
                if (e.getValue().toString().equals(value.asText())) {
                    return e;
                }
            }
        }
        return null;
    }
}
  • 测试接口
@Slf4j
@RestController
@RequestMapping("/test/enum")
public class TestEnumController {

    @Autowired
    TestEnumEntityMapper testEnumEntityMapper;

    @RequestMapping("/save")
    public R<String> save() {
        TestEnumEntity testEnumEntity = new TestEnumEntity();
        testEnumEntity.setTestEnum(TestEnum.A);
        int insert = testEnumEntityMapper.insert(testEnumEntity);
        return R.ok("insert:" + insert);
    }

    @RequestMapping("/get")
    public R<String> get() {
        TestEnumEntity testEnumEntity = testEnumEntityMapper.selectById(1603210329657991170L);
        return R.ok("get:" + testEnumEntity.toString());
    }

    @RequestMapping("/queryWrapper")
    public R queryWrapper() {
        LambdaQueryWrapper<TestEnumEntity> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(TestEnumEntity::getTestEnum, TestEnum.A);
        return R.ok(testEnumEntityMapper.selectList(wrapper));
    }

    @RequestMapping("/querySql")
    public R querySql() {
//        return R.ok(testEnumEntityMapper.selectByEnumCode(TestEnum.A));//ok
        TestEnumEntity testEnumEntity = new TestEnumEntity();
        testEnumEntity.setTestEnum(TestEnum.B);
        return R.ok(testEnumEntityMapper.selectByEntity(testEnumEntity));//OK
    }

    @RequestMapping("/getEnum")
    public R<TestEnumEntity> getEnum() {
        TestEnumEntity testEnumEntity = new TestEnumEntity();
        testEnumEntity.setTestEnum(TestEnum.A);
        return R.ok(testEnumEntity);
    }

    @RequestMapping("/saveEnum")
    public R saveEnum(@RequestBody TestEnumEntity testEnumEntity) {
        System.out.println(testEnumEntity);
        return R.ok(testEnumEntity);
    }

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值