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

原先我们的应用中,将一个实体的状态声明为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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值