java dto 枚举兼容
coding
public class Tmp {
@Getter
public static enum Goods {
Food(1, "food"),
Car(2, "car");
Goods(int id, String name) {
this.id = id;
this.name = name;
}
int id;
String name;
}
@Data
public static class GoodsDTO {
Goods type;
}
public static void main(String[] args) {
// 假设是其他服务传递来的,这里用 new 模拟
GoodsDTO goodsDTO = new GoodsDTO();
goodsDTO.getType().getName();
}
}
我们的场景是枚举和dto都是服务端提供的包文件,但是如果服务端发生了升级。如果客户端调用的时候出现了未知的枚举,会产生null的错误异常,会阻止程序的正常运行。现在希望是可以有默认值,所以枚举类型需要单独增加一个enum,作为默认值。但是由于服务端在正常情况下不会设置为默认值,而是有可能设置一个客户端不存在,但是服务端存在的正常类型,这时候需要在dto做手脚了,首先enum本身是一个基原类型的组合,所以我们可以在封装dto存储一个基原类型,而枚举的获取是在调用方通进行转化,而转化代码本身本身是可以兼容未知类型的。所以这种情况下的使用是不会出现null的。不会因为某些情况下,服务端版本因为高于客户端版本,导致客户端出现null的错误。
public class Tmp {
@Getter
public static enum Goods {
Food(1, "food"),
Car(2, "car"),
Unknown(0, "unknown");
Goods(int id, String name) {
this.id = id;
this.name = name;
}
int id;
String name;
public static Goods getValueOf(int value) {
return Arrays.stream(Goods.values()).filter(v -> v.getId() == value).findFirst().orElse(Unknown);
}
}
@Data
public static class GoodsDTO {
int typeId;
public Goods getType() {
return Goods.getValueOf(this.typeId);
}
}
public static void main(String[] args) {
// 假设是其他服务传递来的,这里用 new 模拟
GoodsDTO goodsDTO = new GoodsDTO();
System.out.println(goodsDTO.getType().getName());;
}
}
评论列表