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"
    }
  ]
}
相关推荐
薯条不要番茄酱3 小时前
【SpringBoot】从零开始全面解析SpringMVC (三)
java·spring boot·后端
编程乐学(Arfan开发工程师)3 小时前
10、底层注解-@Conditional条件装配
java·spring boot·后端·架构
计算机毕设定制辅导-无忧学长4 小时前
Spring Boot 与 RabbitMQ 的深度集成实践(四)
spring boot·rabbitmq·java-rabbitmq
Q_Q19632884754 小时前
python动漫论坛管理系统
开发语言·spring boot·python·django·flask·node.js·php
帮帮志4 小时前
vue3与springboot交互-前后分离【验证element-ui输入的内容】
spring boot·后端·ui
计算机学姐5 小时前
基于SpringBoot的小型民营加油站管理系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
Uranus^5 小时前
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
spring boot·微服务·kafka·消息队列
老华带你飞14 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
my_styles15 小时前
docker-compose部署项目(springboot服务)以及基础环境(mysql、redis等)ruoyi-ry
spring boot·redis·后端·mysql·spring cloud·docker·容器
编程、小哥哥15 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧