spring boot - 接口返回枚举值描述

spring boot - 接口返回枚举值描述

场景

在接口返回对象时,有时候需要返回枚举的描述,如果是list,还要每次遍历处理,现通过自定义注解实现

EnumBind

作用在 DTO 属性内,指枚举值

java 复制代码
/**
 * 枚举描述绑定
 * @Date: 2024/12/2 18:22
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EnumBind {

    /**
     * 枚举转换类
     * @return
     */
    Class<? extends DictConvert<? extends Enum,?,?>> type();

    /**
     * 如要将 StatusEnum的 desc 显示在 UserDTO 中的 statusDesc 字段
     * 则 target: statusDesc
     * @return
     */
    String target();
}

/**
 * 响应自定义格式
 * 而不是默认数据格式 R
 * @Date: 2024/5/16 14:47
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RawResponse {

}

DictConvert

枚举转换

java 复制代码
/**
 * 字典枚举转换
 * @Date: 2024/12/3 16:01
 */
public abstract class DictConvert<E extends Enum<E>, K, V> {

    /**
     * 缓存
     */
    public Map<Class<? extends DictConvert>, Map<K, V>> cache = new ConcurrentHashMap<>();

    /**
     * 转换成 枚举值 及描述
     *
     * @return
     */
    public Map<K, V> convert() {
        return cache.computeIfAbsent(this.getClass(), k -> convert(getDictClz().getEnumConstants()));
    }

    /**
     * 枚举转换
     * @param enums
     * @return
     */
    public abstract Map<K, V> convert(E[] enums);

    /**
     * 转换的具体枚举类型
     * @return
     */
    public abstract Class<E> getDictClz();

}

测试

定义枚举

java 复制代码
@Data
public enum FruitCode{

    APPLE("apple","apple");

    private String code;

    @Getter
    private String desc;

    private FruitCode(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

/**
 * @Date: 2024/12/3 16:41
 */
@Data
public class FruitDto {

    /**
     * 枚举值字段
     * type: 指定转换类
     * target: 枚举值显示字段
     */
    @EnumBind(type = FruitDictConvert.class,target = "desc")
    private String code;

    /**
     * 枚举描述显示字段
     */
    private String desc;
}

定义转换

java 复制代码
/**
 * @Date: 2024/12/3 16:04
 */
@Component
public class FruitDictConvert extends DictConvert<FruitCode,String,String> {

    @Override
    public Map<String, String> convert(FruitCode[] enumConstants) {
        return Arrays.stream(enumConstants).collect(Collectors.toMap(FruitCode::getCode,FruitCode::getDesc));
    }

    @Override
    public Class<FruitCode> getDictClz() {
        return FruitCode.class;
    }
}

接口

java 复制代码
/**
 * @Date: 2024/12/3 16:41
 */
@RestController
public class EnumController {

    @EnumResponse
    @GetMapping("/get/fruit")
    public FruitDto getFruit() {
        FruitDto fruitDto = new FruitDto();
        fruitDto.setCode("apple");
        return fruitDto;
    }

    @EnumResponse
    @GetMapping("/get/fruits")
    public List<FruitDto> getFruits() {
        FruitDto fruitDto = new FruitDto();
        fruitDto.setCode("apple");
        List<FruitDto> list = new ArrayList<>();
        list.add(fruitDto);
        return list;
    }
}

结果:

json 复制代码
{
  "code": "1",
  "data": [
    {
      "code": "apple",
      "desc": "apple"
    }
  ]
}
相关推荐
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
码兄科技2 天前
24小时自助健身房系统软件开发实战指南:功能设计与部署方案
java·spring boot·uni-app
paopaokaka_luck2 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
需要8262 天前
JVM 内存区域与对象创建:一次 GC 从哪来
java·jvm·spring boot·spring·servlet·tomcat
凤山老林2 天前
Spring Boot 应用 JVM 性能调优实战:GC 日志分析、堆内存规划与容器环境避坑
jvm·spring boot·gc·堆内存
计算机毕设定制辅导-无忧学长2 天前
《基于Vue的流浪动物救助中心管理系统的设计与实现》
java·vue.js·spring boot·流浪动物救助中心管理系统
huaweichenai2 天前
spring boot操作PDF
java·spring boot·pdf
guo_wen_qiang3 天前
springboot如何自定义一个启动器starter
java·spring boot·intellij-idea