云盘项目中需要在领域模型、业务模型和 JSON 表示之间转换数据,因此有大量 Java Bean 到 Java Bean 的映射代码,例如:

当两个类的结构一致时,可以使用 BeanUtils.copyProperties(src,aim) 复制属性。属性名称或类型不一致时,例如上例中的 opver 分别为 String 和 Long,需要额外处理。[dozer](http://dozer.sourceforge.net/ "dozer") 是一个可配置的对象映射工具。
安装并使用
在 pom.xml 中加入下面的依赖后,运行 mvn install 将其安装到项目中。

项目依赖 mafka 的 jar 包时,需要按下图的方式声明,否则程序无法运行。

配置文件加载到 dozer 后,即可映射 class。

如果由 Spring 管理依赖,可以按下图导入 dozer 的配置文件,并交由 Spring 容器管理。

属性映射和类型转换
属性名相同时,dozer 可以自动映射 String 到 Long、Long 到 String、Date 到 Timestamp 等类型。属性名称或格式不一致时,需要补充配置。
1. 属性名不相同
可以通过注解配置:


也可以使用 XML 配置:

其中 a 表示源对象,b 表示目标对象,field 表示要映射的属性名称。源字段和目标字段的类型可以不同,dozer 支持的自动转换包括:
Primitive to Primitive Wrapper Primitive to Custom Wrapper Primitive Wrapper to Primitive Wrapper Primitive to Primitive Complex Type to Complex Type String to Primitive String to Primitive Wrapper String to Complex Type if the Complex Type contains a String constructor String to Map Collection to Collection Collection to Array Map to Complex Type Map to Custom Map Type Enum to Enum Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar String to any of the supported Date/Calendar Objects. Objects containing a toString() method that produces a long representing time in (ms) to any supported Date/Calendar object.
上述方式可以覆盖常见的属性映射。云盘中常见 String 和 Date 的相互转换,可按下图配置:

同一类中有多个时间字段时,可以在类级别配置 date-format:

配置文件中的多个类都需要使用同一日期格式时,可以在全局配置 date-format:

该配置会应用于当前文件中的时间类型转换。
2. 自定义转换器
前面的 Date 到 String 使用 dozer 内置转换器。自定义类型转换需要实现 dozer 提供的接口:

随后可在配置文件中引用该转换器:

3. 其他配置
dozer 还提供其他映射配置,详见 dozer官网。
