当前位置: 首页 > article >正文

SpringBoot数据字典字段自动生成对应code和desc

效果:接口会返回orderType,但是这个orderType是枚举的类型(1,2,3,4),我想多返回一个orderTypeDesc给前端展示,这样前端就可以直接拿orderTypeDesc使用了。

1. 定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
//作用是将当前类上的注解也追加到目标类上,如果不加的话,目标类及时加了@EnumTranslation注解,也不会集成该注解的所有注解
@JacksonAnnotationsInside
@JsonSerialize(using = EnumTranslationSerialize.class)
public @interface EnumTranslation {
    //生成的属性名,不写默认原名+Desc
    String generateFieldName() default "";
    //参考的枚举,会根据改枚举的code获取对应的desc
    Class<? extends Enum<?>> targetEnum() ;
}

2. 定义EnumTranslationSerialize类

EnumTranslationSerialize继承了JsonSerializer,实现了ContextualSerializer,用于序列化时多生成一个字段返回。

ContextualSerializer的作用:为了在序列化时获取属性上的注解信息,然后根据注解信息重新创建EnumTranslationSerialize来序列化,这样就能根据注解的配置来序列化了。

@Slf4j
public class EnumTranslationSerialize<E> extends JsonSerializer<Object> implements ContextualSerializer {

    private String targetFieldName;


    private LinkedHashMap<String, String> enumMap;

    public EnumTranslationSerialize() {
        //需要空构造方法,请勿删除
    }


    /**
    * 构造方法,获取当前属性名,生成的属性名,目标枚举
   	*/
    public EnumTranslationSerialize(String fieldName, String targetFieldName, Class enumClass) {
        if (StringUtils.isNotBlank(targetFieldName)) {
            this.targetFieldName = targetFieldName;
        } else {
            this.targetFieldName = fieldName + "Name";
        }
        enumMap = new LinkedHashMap<>();
        try {
            Method getCode = enumClass.getMethod("getCode");
            Method getDesc = enumClass.getMethod("getDesc");
            for (Object everyEnum : EnumUtil.getEnumMap(enumClass).values()) {
                enumMap.put(getCode.invoke(everyEnum).toString(), getDesc.invoke(everyEnum).toString());
            }
        } catch (Exception e) {
            log.error(ExceptionUtils.getStackTrace(e));
        }
    }

    /**
    * 序列化规则
    */
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (Objects.isNull(o)) {
            return;
        }
        try {
            String codeValue = o.toString();
            jsonGenerator.writeString(codeValue);
            String value = enumMap.get(codeValue);
            //多写入一个属性
            if (Objects.nonNull(value)) {
                jsonGenerator.writeFieldName(this.targetFieldName);
                jsonGenerator.writeObject(value);
            }
        } catch (Exception e) {
            log.error(ExceptionUtils.getStackTrace(e));
        }

    }

    /**
    * ContextualSerializer接口的方法,作用是获取属性上的枚举
    */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        if (beanProperty != null) {
            EnumTranslation t = beanProperty.getAnnotation(EnumTranslation.class);
            if (t != null) {
                return new EnumTranslationSerialize<>(beanProperty.getName(), t.targetFieldName(), t.enumC());
            }
        }
        return serializerProvider.findNullValueSerializer(beanProperty);
    }
}

3. 使用

@Data
public class OrderVO {
    @Schema(description = "订单类型")
    @EnumTranslation(generateFieldName = "orderTypeDesc", enumC = OrderType.class)
    private Long orderType;
}

http://www.kler.cn/a/458784.html

相关文章:

  • Unity Mesh生成Cube
  • Cursor登录按钮点击没反应
  • Linux(Centos 7.6)基础命令/常用命令说明
  • gesp(C++一级)(7)洛谷:B3863:[GESP202309 一级] 小明的幸运数
  • 利用JavaScript实现猜数字
  • 优化租赁小程序提升服务效率与用户体验的策略与实践
  • 硬件设计-硬件 EMC 设计规范
  • Day62 图论part11
  • 【每日学点鸿蒙知识】ets匿名类、获取控件坐标、Web显示iframe标签、软键盘导致上移、改变Text的背景色
  • 【Node】什么是Node,及基础使用
  • redis用途都有哪些
  • 《SwiftUI 实现点击按钮播放 MP3 音频》
  • 低空经济与数据资产入表的联系
  • llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~
  • Android 学习小记1
  • plantuml 信号时序图
  • 重装操作系统后 Oracle 11g 数据库数据还原
  • 深入理解Android中的ImageReader与JNI交互
  • Android笔试面试题AI答之Android基础(6)
  • 【深度学习基础之多尺度特征提取】多尺度图像增强(Multi-Scale Image Augmentation)是如何在深度学习网络中提取多尺度特征的?附代码
  • DAY176内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取
  • 《C++设计模式》策略模式
  • 应用层1——C/S、P2P、DNS域名系统
  • 【Rust自学】5.2. struct使用例(加打印调试信息)
  • 使用 Spring Boot 和 GraalVM 的原生镜像
  • Ubuntu 22.04 升级 24.04 问题记录