Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。
Dozer支持简单属性映射,复杂类型映射,双向映射,隐式显式映射以及递归映射。这包括映射还需要在元素级别进行映射的集合属性。
1、导入依赖
net.sf.dozer
dozer-spring
5.5.1
net.sf.dozer
dozer
5.5.1
2、添加配置
@Configuration
public class DozerMapperConfig {
@Bean
public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer/*.xml" ) Resource[] resources) throws Exception {
final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
dozerBeanMapperFactoryBean.setMappingFiles(resources);
return dozerBeanMapperFactoryBean;
}
}
3、在resources下的dozer目录创建xml
bean-mappings.xml
global-configuration.xml
yyyy-MM-dd HH:mm:ss
true
false
4、工具类
接口
public interface IGenerator {
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link T}
* @Description: 单个对象的深度复制及类型转换,vo/domain , po
*/
T convert(S s, Class clz);
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link List}
* @Description: list深度复制
*/
List convert(List s, Class clz);
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link Set}
* @Description: set深度复制
*/
Set convert(Set s, Class clz);
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link T[]}
* @Description: 数组深度复制
*/
T[] convert(S[] s, Class clz);
}
实现
@Component
public class EJBGenerator implements IGenerator {
@Autowired
protected Mapper dozerMapper;
@Override
public T convert(final S s, Class clz) {
return s == null ? null : this.dozerMapper.map(s, clz);
}
@Override
public List convert(List s, Class clz) {
return s == null ? null : s.stream().map(vs -> this.dozerMapper.map(vs, clz)).collect(Collectors.toList());
}
@Override
public Set convert(Set s, Class clz) {
return s == null ? null : s.stream().map(vs -> this.dozerMapper.map(vs, clz)).collect(Collectors.toSet());
}
@Override
public T[] convert(S[] s, Class clz) {
if (s == null) {
return null;
}
@SuppressWarnings("unchecked")
T[] arr = (T[]) Array.newInstance(clz, s.length);
for (int i = 0; i < s.length; i++) {
arr[i] = this.dozerMapper.map(s[i], clz);
}
return arr;
}
}
5、调用示例
@Autowired
private IGenerator generator;
public UserOutputDTO getUserByName (User user) {
UserOutputDTO outputDto = generator.convert(user, UserOutputDTO.class);
return outputDto;
}