# 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;
}
```
## 后续规划
增加对国际化的支持。