将Enum列表返回给前端
Enum示例
@Getter
@AllArgsConstructor
public enum ExampleType {
TYPE_ONE("类型一", 1),
TYPE_TWE("类型二", 1),
;
final String desc;
final Integer code;
/**
* 根据code获取Example类型
*/
public static ExampleType toType(Integer code) {
return Arrays.stream(ExampleType.values())
.filter(e -> e.getCode().equals(code))
.findAny()
.orElse(null);
}
}
返回Enum列表给前端
弯弯绕绕想了很多方法最后发现写一个新的类包一下不就好了吗
@Data
@AllArgsConstructor
public class EnumInstance {
private String desc;
private Integer code;
}
在Enum中添加一个方法
public static List<EnumInstance> getTypeList() {
ArrayList<EnumInstance> typeList = new ArrayList<>(ExampleType.values().length);
for (ExampleType value : ExampleType.values()) {
typeList.add(new EnumInstance(value.getDesc(), value.getCode()));
}
return typeList;
}
直接返回给前端
@GetMapping("/type-list")
public BaseResponse getList() {
List<EnumInstance> typeList = ExampleType.getTypeList();
return success(typeList);
}
不过这样很麻烦,这样写的话每一个新的enum创建都要写一个新的接口. 所以还要优化一下, 前端只要传参数就可以返回对应的列表
两种优化方法, 一种用数据库做数据库字典另一用就后端来做
数据库字典
例如数据库里准备一张表
键 | 值 | 描述 | 所属 | … |
---|---|---|---|---|
type-one | 1 | … | example-type | … |
type-two | 2 | … | example-type | … |
admin | 1 | … | user-type | … |
user | 2 | … | user-type | … |
然后使用所属
字段的值来查出所有的该Type下的信息在前端需要时请求,或者一次全部返回给前端让前端全部保存下来自己写逻辑将字典分组.需要的页面自己调用
这种方法可以实现前端传入一个string后端去数据库查询然后直接返回一个字典数组, 不用一遍一遍的写
临时偷懒: 后端Enum动态返回
先写一下思路:
- 前端传入一个参数
- 后端接收然后询问
EnumFactory
是否存在这个参数对应的enum - 存在返回 | 不存在返回空列表
接口示例:
public BaseResponse getEnumList(EnumListRequest request) {
// 前面创建的EnumInstance, 用它的list返回回去
HashMap<String, List<EnumInstance>> resultMap = new HashMap<>();
// 前端传入想要的enum类型, 一次请求多个
for (String s : request.getList()) {
List<EnumInstance> eList = EnumFactory.getInstance(s);
resultMap.put(s, eList);
}
return success(resultMap);
}
我还想了好久java要怎么像动态语言一样在类中加参数返回多个列表,一问gpt发现脑子可能不太灵光了.用Map就可以做到动态的赋值返回了.
那么重点来了
怎么让enum
自己乖乖的加入到EnumFactory
中并让我调用呢?
EnumFactory:
public class EnumFactory {
private static final Map<String, List<EnumInstance>> instances = new HashMap<>();
// 调用register方法让enum的EnumInstance列表加入到工厂中
public static void register(String enumKey, List<EnumInstance> instanceList) {
if (enumKey != null && instanceList != null) {
instances.put(enumKey, instanceList);
}
}
public static List<EnumInstance> getInstance(String enumKey) {
if (instances.containsKey(enumKey)) {
return instances.get(enumKey);
}
return Collections.emptyList();
}
}
具体Enum类型
// 由于staic的调用是在类被实例化的时候, @Component会让Springboot实例化一次类,触发下面的static方法
@Component
public class AEnum {
static {
// 调用注册方式使其加入工厂类
EnumFactory.register("a-type", AType.getTypeList());
EnumFactory.register("b-type", BType.getTypeList());
}
@Getter
@AllArgsConstructor
public static enum AType{
BASE("基础", 1),
ADVANCED("高级", 2),
;
final String desc;
final Integer code;
public static AType toType(Integer code) {
return Arrays.stream(AType.values())
.filter(e -> e.getCode().equals(code))
.findAny()
.orElse(null);
}
public static List<EnumInstance> getTypeList() {
ArrayList<EnumInstance> typeList = new ArrayList<>(AType.values().length);
for (AType value : AType.values()) {
typeList.add(new EnumInstance(value.getDesc(), value.getCode()));
}
return typeList;
}
}
@Getter
@AllArgsConstructor
public static enum BType{
ICMP("icmp", 1),
TCP("tcp", 2),
UDP("udp", 3),
IP("ip", 4),
IP_IN_IP("ipinip", 5),
OSPF("ospf", 6)
;
final String desc;
final Integer code;
public static BType toType(Integer code) {
return Arrays.stream(BType.values())
.filter(e -> e.getCode().equals(code))
.findAny()
.orElse(null);
}
public static List<EnumInstance> getTypeList() {
ArrayList<EnumInstance> typeList = new ArrayList<>(BType.values().length);
for (BType value : BType.values()) {
typeList.add(new EnumInstance(value.getDesc(), value.getCode()));
}
return typeList;
}
}
}
至此就可以随意获取想要的枚举列表了