Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。
Dozer支持简单属性映射,复杂类型映射,双向映射,隐式显式映射以及递归映射。这包括映射还需要在元素级别进行映射的集合属性。
1、导入依赖
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer-spring</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
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
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
</mappings>
global-configuration.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<date-format>yyyy-MM-dd HH:mm:ss</date-format>
<wildcard>true</wildcard>
<trim-strings>false</trim-strings>
</configuration>
</mappings>
4、工具类
接口
public interface IGenerator {
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link T}
* @Description: 单个对象的深度复制及类型转换,vo/domain , po
*/
<T, S> T convert(S s, Class<T> clz);
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link List<T>}
* @Description: list深度复制
*/
<T, S> List<T> convert(List<S> s, Class<T> clz);
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link Set<T>}
* @Description: set深度复制
*/
<T, S> Set<T> convert(Set<S> s, Class<T> clz);
/**
* @param s 数据对象
* @param clz 复制目标类型
* @return {@link T[]}
* @Description: 数组深度复制
*/
<T, S> T[] convert(S[] s, Class<T> clz);
}
实现
@Component
public class EJBGenerator implements IGenerator {
@Autowired
protected Mapper dozerMapper;
@Override
public <T, S> T convert(final S s, Class<T> clz) {
return s == null ? null : this.dozerMapper.map(s, clz);
}
@Override
public <T, S> List<T> convert(List<S> s, Class<T> clz) {
return s == null ? null : s.stream().map(vs -> this.dozerMapper.map(vs, clz)).collect(Collectors.toList());
}
@Override
public <T, S> Set<T> convert(Set<S> s, Class<T> clz) {
return s == null ? null : s.stream().map(vs -> this.dozerMapper.map(vs, clz)).collect(Collectors.toSet());
}
@Override
public <T, S> T[] convert(S[] s, Class<T> 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;
}