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