Skip to content

数据字典转换 @TransformDict

罗战 edited this page Oct 10, 2022 · 1 revision

背景

数据字典一般适用于字典项有可能改变的情况,项目中会建立一张数据字典表存储各种数据字典数据,如性别、订单状态、系统编码等等,一般核心字段有三个:group(分组,有的表设计会叫type)、code(编码)、text(文本)

举个栗子:

group code text
sex 1
sex 2
order_type 1 已下单
order_type 2 已发货
order_type 3 快递中
... ... ...

介绍

@TransformDict注解定义如下:

/**
 * 数据字典转换
 *
 * @author R
 */
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.FIELD})

@Transform
public @interface TransformDict {

    /**
     * 来源字段
     * <p>
     * 默认自动推断(推断规则:如注解标注的字段是userName,自动推断结果为“user”,“userId”或“userCode”)
     */
    @AliasFor(annotation = Transform.class)
    String from() default "";

    /**
     * 组名
     * 数据字典中有许多不同的组,如”sex“,”orderType“等等
     */
    String group();

}

使用说明

1、自定义DictTransformer

数据字典因为和业务相关,具体的转换逻辑还是交给业务自己定制,Transformer不做过多的干涉

/**
 * 数据字典转换器(示例)
 */
@Component
public class DictTransformer implements IDictTransformer<Integer> {
    @Resource
    private DictionaryService dictionaryService;
    @Override
    public String transform(@Nonnull Integer originalValue, String group) {
        // 实际情况这里可以调用远程服务或本地服务
        return dictionaryService.getText(group, originalValue);
    }
}

注意:

  1. 实现IDictTransformer接口,泛型是数据字典中字典编码(code)的类型
  2. 在类上加上@Component加入spring容器,Transformer会在启动时扫描IDictTransformer接口的实现类,扫描到了实现类才会开启数据字典转换功能
  3. transform方法中根据你的实际情况实现字典转换逻辑,注意group指的就是数据字典中的“组名”,如“sex”、“order_type”等等。

2、使用方式

在字段上使用@TransformDict注解使用转换功能

// 班干部id
private Integer classLeader;

// 班干部名称(数据字典转换,group指定字典分组)
@TransformDict(group = "classLeader")
private String classLeaderName;

3、🎉Enjoy Transforming!