数据字典设置为枚举的用法

2023-11-06

原先我们的应用中,将一个实体的状态声明为Integer(int)类型,然后在对其赋值的时候是使用一个类或接口在其中定义相应的值,在代码其他地方引用对状态进行赋值,例如:

package com.sunlight.warehouse.util;
public class WareHouseConstant {
    //保管区
    public static final Integer AREA_CATE_GORY1 = 1;
    //问题区
    public static final Integer AREA_CATE_GORY2 = 2;
    //检验区
    public static final Integer AREA_CATE_GORY3 = 3;
}
@RequestMapping(method = RequestMethod.GET, value = "/{warehouseId}/storageAreaLocations")
public ResponseData getStorageAreaLocations(@PathVariable("warehouseId") Integer wareHouseId, Integer sparePartId, String locationCode) {
    List<LocationsVO> locationsVos = warehouseService.getWareHouseAreaByWareHouseId(wareHouseId, WareHouseConstant.AREA_CATE_GORY1);
    return RespUtil.make(HttpStatus.OK.value(), HttpStatus.OK.getReasonPhrase(),locationsVos);
}
现在需要我们在应用中将其改为枚举的方式,需要修改的地方如下:
1、定义枚举类
package com.sunlight.storage.in.domain.enums;

/**
 * 配件入库计划单状态枚举
 * @author niufan
 */
public enum PartsInBoundPlanStatusEnum {

    NEW(1), PART_CHECKED(2), CHECKED(3), TERMINATION(4);

    private Integer value;

    PartsInBoundPlanStatusEnum(Integer value) {
        this.value = value;
    }

 public static PartsInBoundPlanStatusEnum parseOfValue(Integer value){
        PartsInBoundPlanStatusEnum partsInBoundPlanStatusEnum;
        if(value != null){
            switch (value) {
                case 1: partsInBoundPlanStatusEnum = PartsInBoundPlanStatusEnum.NEW; break;
                case 2: partsInBoundPlanStatusEnum = PartsInBoundPlanStatusEnum.PART_CHECKED; break;
                case 3: partsInBoundPlanStatusEnum = PartsInBoundPlanStatusEnum.CHECKED; break;
                case 4: partsInBoundPlanStatusEnum = PartsInBoundPlanStatusEnum.TERMINATION; break;
                default: partsInBoundPlanStatusEnum = null;
            }
        } else {
            partsInBoundPlanStatusEnum = null;
        }
        return partsInBoundPlanStatusEnum;
    }

 public static Integer valueOf(PartsInBoundPlanStatusEnum partsInBoundPlanStatusEnum) {
        return partsInBoundPlanStatusEnum == null ? null : partsInBoundPlanStatusEnum.value;
    }

}
2、定义枚举转换类(数据字段值和实体类属性值的转换)
package com.sunlight.storage.in.domain.converter;

import com.sunlight.storage.in.domain.enums.PartsInBoundPlanStatusEnum;

import javax.persistence.AttributeConverter;

/**
 * 配件入库计划单状态枚举转换
 * @author niufan
 */
public class PartsInBoundPlanStatusEnumConverter implements                    AttributeConverter<PartsInBoundPlanStatusEnum, Integer> {

    @Override
    public Integer convertToDatabaseColumn(PartsInBoundPlanStatusEnum attribute) {
        return PartsInBoundPlanStatusEnum.valueOf(attribute);
    }

    @Override
    public PartsInBoundPlanStatusEnum convertToEntityAttribute(Integer dbData) {
        return PartsInBoundPlanStatusEnum.parseOfValue(dbData);
    }
}
3、修改实体类(将实体类中的字段类型改为对应的枚举类型,添加@Converter注解引用2中定义的枚举转换类)
@Basic
@Column(name = "STATUS")
@Convert(converter = PartsInBoundPlanStatusEnumConverter.class)
@JSONField(serializeUsing = PartsInBoundPlanStatusEnumSerializer.class)
public PartsInBoundPlanStatusEnum getStatus() {
    return status;
}
@JSONField(deserializeUsing = PartsInBoundPlanStatusEnumDeserializer.class)
public void setStatus(PartsInBoundPlanStatusEnum status) {
    this.status = status;
}
4、如果使用fastjson,那么需要为每个枚举类定义个性的序列化和反序列类
package com.sunlight.storage.in.domain.enums;

import com.alibaba.fastjson.serializer.EnumSerializer;
import com.alibaba.fastjson.serializer.JSONSerializer;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * 配件入库计划单状态枚举序列化
 * @author niufan
 */
public class PartsInBoundPlanStatusEnumSerializer extends EnumSerializer {

    public void write(JSONSerializer serializer, Object object, Object fieldName,  Type fieldType, int features) throws IOException {
         serializer.out.writeInt(PartsInBoundPlanStatusEnum.valueOf((PartsInBoundPlanStatusE num) object));
    }
}
package com.sunlight.storage.in.domain.enums;

import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;

import java.lang.reflect.Type;

/**
 * 配件入库计划单状态枚举反序列化
 * @author niufan
 */
public class PartsInBoundPlanStatusEnumDeserializer implements ObjectDeserializer {

    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return (T)  PartsInBoundPlanStatusEnum.parseOfValue(parser.getLexer().intValue());
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}
 5、修改对应的VO
@JSONField(serializeUsing = PartsInBoundPlanStatusEnumSerializer.class)
public PartsInBoundPlanStatusEnum getStatus() {
    return status;
}
@JSONField(deserializeUsing = PartsInBoundPlanStatusEnumDeserializer.class)
public void setStatus(PartsInBoundPlanStatusEnum status) {
    this.status = status;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据字典设置为枚举的用法 的相关文章

  • python数据挖掘分析案例_基于Python的Titanic【案例分析】

    这次数据分析的案例是 经典的数据分析案例 泰坦尼克号生还预测 本案例的分析思路包括以下三个部分 数据集描述与来源展示 数据分析过程 明确分析问题 理解数据 数据清洗 数据探索性分析 数据建模与分析 模型选择与结果输出 数据分析总结 数据集描
  • python 计算置信区间,计算置信区间(示例代码)

    proc freq data datain by group tables var missprint nowarn binomial level 1 cl exact alpha 0 05 weight n zero 对发生的做置信区间
  • C语言数据结构之链表的增删改查

    C语言数据结构之链表的增删改查 tips 昨天学习了c语言结构体 今天来看看c语言数据结构之链表 单链表 的增删改查操作 首先我们创建一个简单的学生信息结构体 作为后面增删改查的主体 student结构体包含 数据域 学号 分数 指针域 一
  • jupyter报错

    1 打开anaconda jupyter notebook时报错 Traceback most recent call last File E python anaconda Scripts jupyter notebook script
  • 分页存储管理,分段存储管理,段页式存储管理

    概括的挺详细的 然后我加上了纯分页系统和请求式分页系统的基本概念 也对有些部分稍作修改 一 分页存储管理 1 基本概念 页面和物理块 将一个进程的逻辑地址空间划分成若干大小相等的部分 每一部分称为页或页面 页面的大小通常是2的次幂 大约在5
  • 区块链:Solidity值类型(地址Address)

    地址Address 以太坊钱包地址位数验证 以太坊中的地址的长度为20字节 一字节等于8位 一共160位 所以address其实亦可以用uint160来声明 我的以太坊钱包地址为0xDF12793CA392ff748adF013D146f8
  • 可变个数的参数

    1 用数组的方式来 例如 pulic void print String args for int i 0 i
  • Apache POI 4.1.0 发布,Office 文档的 Java API

    Apache POI 4 1 0 发布了 Apache POI 是用 Java 编写的开源跨平台的 Java API 提供 API 给 Java 程式对 Microsoft Office 格式档案读和写的功能 简而言之 你可以使用 Java
  • CSDN高校俱乐部第三届研讨会

    CSDN高校俱乐部第三届研讨会 于2013年6月6日在国家会议中心成功举办 感谢大家从全国各地远道而来参加 本次研讨会邀请了来自全国32所高校俱乐部的指导老师 同学以及优秀巡讲讲师和微软Imagine Cup 2013大赛负责人 会议开始先
  • 【MySQL高级篇笔记-数据库的设计规范(中) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一 为什么要数据库设计 二 范式 1 范式简介 2 范式都包括哪些 3 键和相关属性的概念 4 第一范式 1st NF 5 第二范式 2nd NF 6 第三范式 3rd NF 7 小结 三 反范
  • Flutter内存优化总结

    Flutter内存优化是一个非常复杂的问题 其中涉及多个方面的优化策略 下面将从以下几个方面对Flutter的内存优化进行具体实现的总结 一 减少Widget的创建和销毁 Widget的创建和销毁是Flutter中内存占用最大和最频繁的操作
  • C++学习笔记黑马程序员(有一些自己的思考)

    学习目标 掌握 C 入门知识 C 核心编程 掌握 STL 洛谷算法训练题 学习内容 C 入门知识 一 基本介绍 C 不同于C语言 这是一门面向对象的高级程序设计语言 二 面向对象与面向过程 什么是面向对象 对象又是什么 对象是对客观事物的抽
  • Flink_04_Watermark(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 时间语义 EventTime 在1 12版本中被设置成了默认 是事件
  • 求平方根问题 (C++ 实现)

    下面是用二分法和牛顿迭代法求一个正数的平方根 二分法 这里的题目稍微宽了一点点 包含了整数和小数的情况 这里二分法就不用多说了 如果中间值的平方与目标值在误差范围内 则返回 否则根据大小情况改变左 右区间的端点 include
  • 每日一题:选数

    选数 题目 Daimayuan Online Judge 原本我的思路是 大致题意就是从n个数中选取若干数 使得它们的和mod n等于0 任意选取 无关顺序 是可以跳着选的 也就是对于每一个数 有两种选择 选与不选 于是我想用01背包 但是
  • linux屏保默认图片,分享

    Ubuntu 4 10 Warty Warthog Ubuntu 5 04 Hoary Hedgehog Ubuntu 5 10 Breezy Badger Ubuntu 6 06 Dapper Drake Ubuntu 6 10 Edgy
  • 多个chatgpt模型

    GPT4All 简介 GPT4AllNomic AI Team 从 Alpaca 获得灵感 使用 GPT 3 5 Turbo OpenAI API 收集了大约 800 000 个提示 响应对 创建了 430 000 个助手式提示和生成训练对
  • SQL中in和not in遇到NULL值的查询情况

    首先 大家可以先试着做这道练习题 题目 给定一个表 T id 是树节点的编号 pid 是它父节点的 id 树中每个节点属于以下三种类型之一 叶子 如果这个节点没有任何孩子节点 根 如果这个节点是整棵树的根 即没有父节点 内部节点 如果这个节
  • 最简单的引入Vue看板娘教程

    最简单的引入Vue看板娘教程 一 项目引入 这里使用的是来自Evgo老哥的 vue live2d 使用简单 直接引入就好 具体的可以看老哥的文档 二 简单实现 在你的项目引入 npm install vue live2d 接着在想要引入看板
  • Unity3D关于iTween知识详解和接口总结

    目录 1 简介 2 物体移动方法 3 物体的颜色变化 4 摄像机淡入淡出 5 音频方法 6 Look类方法 7 旋转方法 8 物体大小缩放 9 晃动效果方法 10 值方法 11 外部工具方法 12 iTweenPath 1 简介 iTwee

随机推荐