# entity-dict-spring-boot-starter **Repository Path**: oceanAction_admin/entity-dict-spring-boot-starter ## Basic Information - **Project Name**: entity-dict-spring-boot-starter - **Description**: 实体类映射组件 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-07-29 - **Last Updated**: 2022-05-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 对象字段字典映射组件 ## 实现的背景 ​ 应用系统中通常会维护一套字典数据,如下拉菜单可选项;列表一些状态字段。 往往这些字段在入库时通常为code编码,显示时为对应展示文案。 对这类需求从前后端数据交互来说也可以分为两种方案: a、后端维护一套枚举值,查询接口返回code编码,前端也同步维护一套,前端根据code编码进行映射 b、后端维护枚举值,前端不维护,查询时后端接口根据编码进行映射返回对应字段。 按照前后端分离项目实施过程中“重后端轻前端”的思想来看 b 方案显的更为合理。 前端代码更轻,后端也不用关注前端维护的枚举是否和后端的保证了同步,大大降低了耦合度。 ​ 那在后端去维护还有获取映射表的方式也有很多,从配置方式来说可以是建枚举类,也可以是配置到数据库。 从获取方式来说,最直接的方式是获取数据后遍历数据根据code编码去查对应文案,这种方案过于死板,需要大量重复性操作。 如果是数据库配置的也可以关联到sql中进行查询,但是增加了sql的复杂度。 ​ 并且字典数的特性是读多写少,一般只在发版环节会触发数据的修改,数据量来说一般不会太大,故完全可以使用缓存机制。 同时利用aop将通用功能进行提取,对开发者屏蔽重复性工作,故设计该工具组件。 ## 功能说明 支持对枚举类进行映射,对应枚举需要实现指定接口 开放式式映射:根据入参 dictTable、dictCode 自定义映射逻辑 查询一次映射后会存入缓存中,目前缓存 ## 使用步骤 下载代码。 目前还未上传中央仓库,先本地mvn clean install ### 添加依赖 需要覆盖到实体类所在的包,需要实现映射功能的服务 ```xml com.ant entity-dict-spring-boot-starter 0.0.1-SNAPSHOT ``` ### 枚举实现字典映射接口 DictEnumInterface ```java public interface DictEnumInterface { String getCode(); String getName(); } ``` 如 ```java 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默认实现了对枚举类映射的处理逻辑。 如果不实现,则无法进行字典映射。 ```java @Service public class EntityDictServiceImpl extends BaseEntityDictService { @Override public Map queryByDictCode(String dictCode) { return null; } @Override public Map queryByDictTable(String dicTable, String dictCode) { return null; } } ``` queryByDictCode、queryByDictTable为自定义映射方法,根据自己的需求实现。 ### 实体类添加对应注解 @Dict注解说明 source 属性为根据哪个字段进行映射,可以为空,如果为空则根据自身值进行映射 dictTable 映射表名 dictCode 映射的业务类型 enumType 枚举类型 enumType 不为空时不需要填 dictTable、dictCode,根据指定枚举类进行映射,dictTable可空 例: ```java @Dict(source = "state",enumType = StateEnum.class) private String stateDesc; @Dict(source = "state",dictTable = "sys_dict" ,dictCode = "stateEnum") private String stateDesc; ``` 注意事项:如果使用了 source配置,注意源属性是否已配置字段映射。如果出现这种情况,源属性先进行了映射的话则可能会导致目标属性映射失败。 ### 方法添加需要对返回值进行字典映射注解 @ReturnNeedDict ```java @ReturnNeedDict public ApplyShopAmazonDto queryApplyAmazonShop(Long userId, Long shopId) { return null; } ``` ## 后续规划 增加对国际化的支持。