一.枚举类
@Getter
@AllArgsConstructor
@DictEnum(key = "gender", desc = "性别")
public enum GenderEnum implements IBaseEnum<Integer> {
MAN(1, "男"),
WOMAN(2, "女"),
OTHERS(3, "其他");
private Integer value;
private String desc;
}
public interface IBaseEnum<T extends Serializable> extends IEnum<T>{
String getDesc();
}
public interface IEnum<T extends Serializable> {
T getValue();
}
二.工具类
public class EnumUtils {
public static <T extends IBaseEnum<Integer>> T select(Class<T> baseEnumClass, Integer value) {
if (Objects.isNull(value)) {
return null;
}
return Stream.of(baseEnumClass.getEnumConstants()).filter(x -> x.getValue().equals(value)).findAny().orElse(null);
}
public static <T extends IBaseEnum<Integer>> String getDescByKey(Class<T> baseEnumClass, Integer value) {
return Optional.ofNullable(select(baseEnumClass, value)).map(IBaseEnum::getDesc).orElse(StringUtils.EMPTY);
}
}
三.作为枚举翻译使用
@ApiModelProperty("性别")
private String genderDesc;
public String getGenderDesc() {
return EnumUtils.getDescByKey(GenderEnum.class, getGender());
}
四.作为字典使用
1.字典类
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DictEnum {
String key() default "";
String desc() default "";
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DictionaryManagement", description = "字典管理")
public class DictionaryManagement extends BaseEntity {
@ApiModelProperty("名称")
private String dictName;
@ApiModelProperty("类型")
private String dictType;
@ApiModelProperty("是否系统变量")
private Boolean sysDictFlag;
@ApiModelProperty("状态 0.启用 1.禁用")
private Integer status;
@TableField(exist = false)
private List<DictionaryData> ddList;
@TableField(exist = false)
@ApiModelProperty("是否枚举类")
private Boolean enumFlag = Boolean.FALSE;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DictionaryData", description = "字典数据")
public class DictionaryData extends BaseEntity {
@ApiModelProperty("字典id")
private Long dictMgtId;
@ApiModelProperty("标签")
private String dictTag;
@ApiModelProperty("键值")
private String dictValue;
@ApiModelProperty("排序")
private Integer orderNum;
@ApiModelProperty("状态 0.启用 1.停用")
private Integer status;
}
2.枚举初始化
- CommonConstant.BASE_PACKAGE 为枚举包所在的位置,根据项目实际情况配置
@Component
public class DictEnumConfig implements InitializingBean {
private static Map<String, DictionaryManagement> dmMap = new HashMap<>();
public static Map<String, DictionaryManagement> getDmMap() {
return dmMap;
}
private static void setDmMap(Map<String, DictionaryManagement> dmMap) {
DictEnumConfig.dmMap = dmMap;
}
@Override
public void afterPropertiesSet() {
Reflections reflections = new Reflections(CommonConstant.BASE_PACKAGE);
Set<Class<? extends IBaseEnum>> monitorClasses = reflections.getSubTypesOf(IBaseEnum.class);
List<DictionaryManagement> dmList = new ArrayList<>();
monitorClasses.forEach(m -> {
if (m.isAnnotationPresent(DictEnum.class)) {
DictEnum dictEnum = m.getAnnotation(DictEnum.class);
DictionaryManagement dictionaryManagement = new DictionaryManagement();
dictionaryManagement.setEnumFlag(Boolean.TRUE);
dictionaryManagement.setDictType(dictEnum.key());
dictionaryManagement.setDictName(dictEnum.desc());
dictionaryManagement.setStatus(StatusEnum.ENABLE.getValue());
dictionaryManagement.setSysDictFlag(Boolean.TRUE);
List<DictionaryData> ddList = new ArrayList<>();
DictionaryData dictionaryData;
IBaseEnum[] enumConstants = m.getEnumConstants();
for (IBaseEnum baseEnum : enumConstants) {
dictionaryData = new DictionaryData();
dictionaryData.setDictValue(baseEnum.getValue().toString());
dictionaryData.setDictTag(baseEnum.getDesc());
dictionaryData.setStatus(StatusEnum.ENABLE.getValue());
ddList.add(dictionaryData);
}
dictionaryManagement.setDdList(ddList);
dmList.add(dictionaryManagement);
}
});
setDmMap(dmList.stream().collect(Collectors.toMap(DictionaryManagement::getDictType, Function.identity())));
}
}
3.调用方式
- 此处优先枚举,后字典,也可采用先字典,后枚举,或者混合使用
@ApiOperation(value = "根据多个字典类型查询字典数据")
@GetMapping("/listAllDataByTypes")
public List<DictionaryManagement> listAllDataByTypes(@RequestParam Set<String> dictTypeList) {
List<DictionaryManagement> dmList = new ArrayList<>();
Map<String, DictionaryManagement> dmMap = DictEnumConfig.getDmMap();
Set<String> dictTypeListRemain = new HashSet<>();
for (String dictType : dictTypeList) {
if (dmMap.containsKey(dictType)){
DictionaryManagement dictionaryManagement = dmMap.get(dictType);
dmList.add(dictionaryManagement);
}else {
dictTypeListRemain.add(dictType);
}
}
List<DictionaryManagement> dictionaryManagements = dictionaryManagementService.listAllDataByTypes(dictTypeListRemain);
dmList.addAll(dictionaryManagements);
return dmList;
}