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"
    }
  ]
}
相关推荐
爱宇阳5 分钟前
Java Spring Boot 项目 Docker 容器化部署教程
java·spring boot·docker
ACGkaka_16 分钟前
SpringBoot 实战(四十)集成 Statemachine
java·spring boot·后端
余衫马2 小时前
微服务SpringCloud报错合集
spring boot·gateway
一 乐3 小时前
流浪动物救助|流浪猫狗救助|基于Springboot+vue的流浪猫狗救助平台设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设
爱宇阳3 小时前
Spring Boot 项目 GitLab CI/CD 自动构建并推送到 Harbor 教程
spring boot·ci/cd·gitlab
L.EscaRC3 小时前
面向 Spring Boot 的 JVM 深度解析
jvm·spring boot·后端
老华带你飞4 小时前
订票系统|车票管理系统|基于Java+vue的车票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·订票系统
陈果然DeepVersion4 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十一)
java·spring boot·微服务·ai·kafka·面试题·rag
whltaoin4 小时前
【浏览器CORS问题解决方案】SpringBoot+Vue3前后端全覆盖:浏览器跨域问题的多样化解决方案
vue.js·spring boot·浏览器跨域问题
Mos_x5 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·spring