# 字典数据映射

从1.7.0版本开始，采用重新设计的字典映射方案，代替原有的继承`AbstractDictionaryConverter`并配置`converter`和`inverseConverter`的实现方式。

{% hint style="info" %}
“字典数据”并不特指字典表中的数据，只要是能通过Key-Value映射关系转换的数据均视为字典数据（如：航司ICAO编码和航司名称的映射）。
{% endhint %}

使用者需要实现`DictDataResolver`接口，然后在字典映射字段上配置`@DictMapping`注解，指定字典的key、使用的resolver、是否缓存数据以及缓存生命周期等参数。

```java
class Flight {
    String airportIata;
}
class FlightDto {
    // 默认开启缓存并且存活时间为60s，根据业务需要可以灵活配置
    @DictMapping(key="IATA", resolver=AirportDictDataResolver.class)
    @Mapping(field="airportIata")
    String airport;
}
// 此处仅作为示例，实际使用时一般通过依赖数据服务获取数据，然后将结果转换为Map
public class AirportDictDataResolver implements DictDataResolver {

    @Override
    public Map<Object, Object> resolve(String key) {
        if (key.equals("IATA")) {
            Map<Object, Object> data = new HashMap<>();
            data.put("TAO", "青岛");
            data.put("DLC", "大连");
            data.put("SHE", "沈阳");
            return data;
        } else {
            Map<Object, Object> data = new HashMap<>();
            data.put("ZSQD", "青岛");
            data.put("ZYTL", "大连");
            data.put("ZYTX", "沈阳");
            return data;
        }
    }
}

FlightDto flightDto = new FlightDto("青岛")
Flight flight = BeanUtils.copyProperties(flightDto, Flight.class);

System.out.println(flight.getAirportIata()) // "TAO"
```

{% hint style="info" %}
详细说明请参考[`DictMapping`和`DictDataResolver`的说眀](https://ankang.gitbook.io/commons/ru-men/gai-nian#dictmapping)
{% endhint %}

{% hint style="warning" %}
字典映射默认开启缓存（默认生命周期60s），可以业务数据需要调整`@DictMapping`配置。缓存在生命周期内无法手动失效，如果需要较高的数据一致性，建议禁用缓存，由字典数据源接口实现并管理缓存。
{% endhint %}

{% hint style="danger" %}
字典映射如果不满足唯一性反向查找（即`DictDataResolver`返回的`Map`中`value`有重复的情况），映射字段必须配置为`@Mapping(oneway = true)`（单向拷贝）防止错误的结果。
{% endhint %}
