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"
    }
  ]
}
相关推荐
MrSYJ1 小时前
学完涨工资的技巧2:Spring Authorization Server如何签发JWTToken
java·spring boot·微服务
摇滚侠2 小时前
Spring Boot 3零基础教程,yml语法细节,笔记16
java·spring boot·笔记
RunningShare2 小时前
高可用架构实战:SpringBoot+MongoDB构建AI原生应用
spring boot·mongodb·架构
艾菜籽4 小时前
SpringMVC练习:加法计算器与登录
java·spring boot·spring·mvc
LawsonJin4 小时前
springboot实现微信小程序支付(服务商和普通商户模式)
spring boot·后端·微信小程序
optimistic_chen5 小时前
【Java EE进阶 --- SpringBoot】Mybatis操作数据库(基础二)
xml·数据库·spring boot·笔记·java-ee·mybatis
泉城老铁5 小时前
tomcat 部署springboot,线程经常断开导致数据库连接池关闭,如何解决
java·spring boot·后端
thginWalker5 小时前
使用Spring Boot构建多维度配置层
spring boot
摇滚侠5 小时前
Spring Boot 3零基础教程,properties文件中配置和类的属性绑定,笔记14
java·spring boot·笔记
星光一影5 小时前
HIS系统天花板,十大核心模块,门诊/住院/医保全流程打通,医院数字化转型首选
java·spring boot·后端·sql·elementui·html·scss