对象字段字典映射组件

1,248 阅读3分钟

实现的背景

应用系统中通常会维护一套字典数据,如下拉菜单可选项;列表一些状态字段。

往往这些字段在入库时通常为code编码,显示时为对应展示文案。

对这类需求从前后端数据交互来说也可以分为两种方案:

a、后端维护一套枚举值,查询接口返回code编码,前端也同步维护一套,前端根据code编码进行映射

b、后端维护枚举值,前端不维护,查询时后端接口根据编码进行映射返回对应字段。

按照前后端分离项目实施过程中“重后端轻前端”的思想来看 b 方案显的更为合理。

前端代码更轻,后端也不用关注前端维护的枚举是否和后端的保证了同步,大大降低了耦合度。

那在后端去维护还有获取映射表的方式也有很多,从配置方式来说可以是建枚举类,也可以是配置到数据库。

从获取方式来说,最直接的方式是获取数据后遍历数据根据code编码去查对应文案,这种方案过于死板,需要大量重复性操作。

如果是数据库配置的也可以关联到sql中进行查询,但是增加了sql的复杂度。

并且字典数的特性是读多写少,一般只在发版环节会触发数据的修改,数据量来说一般不会太大,故完全可以使用缓存机制。

同时利用aop将通用功能进行提取,对开发者屏蔽重复性工作,故设计该工具组件。

功能说明

支持对枚举类进行映射,对应枚举需要实现指定接口

开放式式映射:根据入参 dictTable、dictCode 自定义映射逻辑

查询一次映射后会存入缓存中,目前缓存

使用步骤

下载代码。

目前还未上传中央仓库,先本地mvn clean install

添加依赖

需要覆盖到实体类所在的包,需要实现映射功能的服务

<dependency>
    <groupId>com.ant</groupId>
    <artifactId>entity-dict-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

枚举实现字典映射接口 DictEnumInterface

public interface DictEnumInterface {
    String getCode();
​
    String getName();
}

public enum StateEnum implements DictEnumInterface {
    pass("pass","通过"),
    unPass("unPass","未通过");
​
    StateEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }
​
    private String code;
    private String name;
​
    @Override
    public String getCode() {
        return code;
    }
​
    @Override
    public String getName() {
        return name;
    }
}

实现字典实现类(重要)

注意,使用该组件需要实现其定义的EntityDictService接口,实现类推荐继承BaseEntityDictService。

因为BaseEntityDictService默认实现了对枚举类映射的处理逻辑。

如果不实现,则无法进行字典映射。

@Service
public class EntityDictServiceImpl extends BaseEntityDictService {
    @Override
    public Map<String, String> queryByDictCode(String dictCode) {
        return null;
    }
​
    @Override
    public Map<String, String> queryByDictTable(String dicTable, String dictCode) {
        return null;
    }
}

queryByDictCode、queryByDictTable为自定义映射方法,根据自己的需求实现。

实体类添加对应注解

@Dict注解说明

source 属性为根据哪个字段进行映射,可以为空,如果为空则根据自身值进行映射

dictTable 映射表名

dictCode 映射的业务类型

enumType 枚举类型

enumType 不为空时不需要填 dictTable、dictCode,根据指定枚举类进行映射,dictTable可空

例:

@Dict(source = "state",enumType = StateEnum.class)
private String stateDesc;
​
@Dict(source = "state",dictTable = "sys_dict" ,dictCode  = "stateEnum")
private String stateDesc;

注意事项:如果使用了 source配置,注意源属性是否已配置字段映射。如果出现这种情况,源属性先进行了映射的话则可能会导致目标属性映射失败。

方法添加需要对返回值进行字典映射注解

@ReturnNeedDict

@ReturnNeedDict
public ApplyShopAmazonDto queryApplyAmazonShop(Long userId, Long shopId) {
   
    return null;
}

后续规划

增加对国际化的支持。