- 定义公共接口
public interface BaseEnum {
Integer getCode();
String getDesc();
}
- 需要下拉的枚举继承接口
import com.cdtye.component.base.enums.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
@Getter
@AllArgsConstructor
public enum CommonStatusEnum implements BaseEnum {
INVALID(0, "无效"),
VALID(1, "有效");
private Integer code;
private String desc;
public static String getDescByCode(Integer code) {
if (Objects.nonNull(code)) {
for (CommonStatusEnum value : CommonStatusEnum.values()) {
if (code.equals(value.code)) {
return value.desc;
}
}
}
return null;
}
public static CommonStatusEnum getByDesc(String desc) {
if (StringUtils.isNotBlank(desc)) {
for (CommonStatusEnum value : CommonStatusEnum.values()) {
if (value.getDesc().equals(desc.trim())) {
return value;
}
}
}
return null;
}
}
- class工具类
import com.google.common.collect.Lists;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
import java.io.IOException;
import java.util.*;
public class ClassUtils {
public static List<Class<?>> getInterfaceImpls(Class<?> target) throws IOException, ClassNotFoundException {
ArrayList<Class<?>> subclassaes = Lists.newArrayList();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 加載資源 classpath*:com/hadluo/**/*.class : 找环境变量下的 com/hadluo下的 所有.class文件
Resource[] resources = resolver.getResources("classpath*:com/cdtye/**/*.class");
for (Resource res : resources) {
// 先获取resource的元信息,然后获取class元信息,最后得到 class 全路径
String clsName = new SimpleMetadataReaderFactory().getMetadataReader(res).getClassMetadata().getClassName();
Class<?> classObject = Class.forName(clsName);
if (classObject.getSuperclass() == null) {
continue;
}
Set<Class<?>> interfaces = new HashSet<>(Arrays.asList(classObject.getInterfaces()));
// 通过名称加载
if (interfaces.contains(target)) {
subclassaes.add(Class.forName(classObject.getName()));
}
}
return subclassaes;
}
}
- 定义响应对象
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "枚举po对象", description = "枚举po对象")
public class EnumPo implements Serializable {
@ApiModelProperty(value = "code")
private String code;
@ApiModelProperty(value = "描述")
private String desc;
}
- 请求controller
import xx.xx.utils.ClassUtils;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Api(tags = "通用controller")
@RestController
@RequestMapping("/common")
public class CommonController {
@ApiOperation(value = "获取所有枚举", notes = "返回对象最新数据")
@GetMapping("/getEnums")
public AjaxJson<Map> getEnums(String enumName) throws Exception {
List<Class<?>> interfaceImpls = ClassUtils.getInterfaceImpls(BaseEnum.class);
Map<String, List<EnumPo>> result = new HashMap<>();
if (CollectionUtils.isNotEmpty(interfaceImpls)) {
for (Class<?> clz : interfaceImpls) {
if (clz.isEnum() && (StringUtils.isBlank(enumName) || clz.getSimpleName().equalsIgnoreCase(enumName))) {
List<EnumPo> enumPos = Lists.newArrayList();
Object[] enumConstants = clz.getEnumConstants();
Method getCode = clz.getMethod("getCode");
Method getDesc = clz.getMethod("getDesc");
for (Object enumConstant : enumConstants) {
EnumPo enumPo = new EnumPo();
enumPo.setCode(getCode.invoke(enumConstant) + "");
enumPo.setDesc(getDesc.invoke(enumConstant) + "");
enumPos.add(enumPo);
}
result.put(clz.getSimpleName(), enumPos);
}
}
}
return AjaxJson.success(result);
}
@ApiOperation(value = "通过枚举名称获取枚举值", notes = "返回对象最新数据")
@GetMapping("/getEnumValusByEnumName")
public AjaxJson<List<EnumPo>> getEnumValusByEnumName(String enumName) throws Exception {
List<Class<?>> interfaceImpls = ClassUtils.getInterfaceImpls(BaseEnum.class);
List<EnumPo> enumPos = Lists.newArrayList();
if (CollectionUtils.isNotEmpty(interfaceImpls)) {
for (Class<?> clz : interfaceImpls) {
if ((StringUtils.isNotBlank(enumName) && clz.getSimpleName().equalsIgnoreCase(enumName))) {
enumPos = Lists.newArrayList();
Object[] enumConstants = clz.getEnumConstants();
Method getCode = clz.getMethod("getCode");
Method getDesc = clz.getMethod("getDesc");
for (Object enumConstant : enumConstants) {
EnumPo enumPo = new EnumPo();
enumPo.setCode(getCode.invoke(enumConstant) + "");
enumPo.setDesc(getDesc.invoke(enumConstant) + "");
enumPos.add(enumPo);
}
}
}
}
return AjaxJson.success(enumPos);
}
}