字典数据映射

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

“字典数据”并不特指字典表中的数据,只要是能通过Key-Value映射关系转换的数据均视为字典数据(如:航司ICAO编码和航司名称的映射)。

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

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"

字典映射默认开启缓存(默认生命周期60s),可以业务数据需要调整@DictMapping配置。缓存在生命周期内无法手动失效,如果需要较高的数据一致性,建议禁用缓存,由字典数据源接口实现并管理缓存。

字典映射如果不满足唯一性反向查找(即DictDataResolver返回的Mapvalue有重复的情况),映射字段必须配置为@Mapping(oneway = true)(单向拷贝)防止错误的结果。

Last updated