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

来源:互联网 发布:mac os sierra 10.13 编辑:程序博客网 时间:2024/05/28 23:22

原先我们的应用中,将一个实体的状态声明为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;}
1 0
原创粉丝点击