Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵活的,可重用的和可配置的开源映射框架。
常用于:
注意的场景:
建议:
pom.xml加入以下依赖
<dependency>
<groupId>net.sf.dozergroupId>
<artifactId>dozer-springartifactId>
<version>5.5.1version>
dependency>
<dependency>
<groupId>net.sf.dozergroupId>
<artifactId>dozerartifactId>
<version>5.5.1version>
dependency>
resource文件夹下新建dozer文件夹, 并新建bean-mappings.xml, global-configuration.xml
<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>
<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:ssdate-format>
<wildcard>truewildcard>
<trim-strings>falsetrim-strings>
<custom-converters>
<converter type="com.dongao.beacon.ds.web.admin.tookit.EnumIntegerBiDirectionalDozerConverter">
<class-a>java.lang.Enumclass-a>
<class-b>java.lang.Integerclass-b>
converter>
custom-converters>
configuration>
mappings>
用于SpringBoot寻找DozerBeanMapperFactoryBean的配置
新建DozerMapperConfig.java
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;
}
}
建议新建包专门放置Dozer工具
IGenerator.java
接口public interface IGenerator {
/**
* @Description: 单个对象的深度复制及类型转换,vo/domain , po
* @param s 数据对象
* @param clz 复制目标类型
* @return
* @author [email protected]
* @Time 2018年5月9日 下午3:53:24
*/
T convert(S s, Class clz);
/**
* @Description
: 深度复制结果集(
ResultSet
为自定义的分页结果集)
*
@param s 数据对象
* @param clz 复制目标类型
* @return
* @author [email protected]
* @Time 2018年5月9日 下午3:53:24
*/
ResultSet
convert(
ResultSet
s, Class clz);
/**
* @Description: list深度复制
* @param s 数据对象
* @param clz 复制目标类型
* @return
* @author [email protected]
* @Time 2018年5月9日 下午3:54:08
*/
List convert(List s, Class clz);
/**
* @Description: set深度复制
* @param s 数据对象
* @param clz 复制目标类型
* @return
* @author [email protected]
* @Time 2018年5月9日 下午3:54:39
*/
Set convert(Set s, Class clz);
/**
* @Description: 数组深度复制
* @param s 数据对象
* @param clz 复制目标类型
* @return
* @author [email protected]
* @Time 2018年5月9日 下午3:54:57
*/
T[] convert(S[] s, Class clz);
}
IGenerator
实现@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {
@Autowired
protected Mapper dozerMapper;
public T convert(S s, Class clz) {
if (s == null) {
return null;
}
return this.dozerMapper.map(s, clz);
}
public
ResultSet
convert
(
ResultSet
s, Class clz) {
if (s == null) {
return null
;
}
ResultSet
resultSet
=
new
ResultSet
();
for
(S vs : s.getResult()) {
resultSet
.getResult().add(
this
.dozerMapper.map(vs, clz));
}
resultSet
.setTotal(s.getTotal());
resultSet
.setExt(s.getExt());
resultSet
.setModifyTime(s.getModifyTime());
return
resultSet
;
}
public List convert(List s, Class clz) {
if (s == null) {
return null;
}
List list = new ArrayList();
for (S vs : s) {
list.add(this.dozerMapper.map(vs, clz));
}
return list;
}
public Set convert(Set s, Class clz) {
if (s == null) {
return null;
}
Set set = new HashSet();
for (S vs : s) {
set.add(this.dozerMapper.map(vs, clz));
}
return set;
}
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;
}
}
一般在公共父类中引入, 此处例子为前端公共Controller引入
@Controller
public class BaseController {
@Autowired
protected EJBGenerator ejbGenerator = new EJBGenerator();
protected final Logger logger = LoggerFactory.getLogger(getClass());
}
// 个人信息变更记录session
SessionUserDetails userDetails = ejbGenerator.convert(userVo, SessionUserDetails.class);