在项目中要经常转换model, 有了自动转换无疑是最优雅, 最有效率的工具
maven pom.xml
<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>
DozerConfig.java
package com.xxx.xxx.config.dozer;
import org.dozer.spring.DozerBeanMapperFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
@Configuration
public class DozerConfig {
@Value("classpath*:dozer/*.xml")
private Resource[] resources;
@Bean
public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean() {
DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
dozerBeanMapperFactoryBean.setMappingFiles(this.resources);
return dozerBeanMapperFactoryBean;
}
}
DozerEnumConverter.java (对枚举的支持)
package com.xxx.xxx.config.dozer;
import com.xxx.xxx.enums.BaseEnum;
import org.dozer.CustomConverter;
import org.dozer.MappingException;
import java.util.Objects;
public class DozerEnumConverter implements CustomConverter {
@Override
public Object convert(Object destination, Object source, Class<?> destinationClass, Class<?> sourceClass) {
if (source == null) {
return null;
}
if (source instanceof BaseEnum) {
return ((BaseEnum) source).getCode();
} else if (source instanceof Integer && destinationClass.isEnum()) {
BaseEnum[] enums = (BaseEnum[]) destinationClass.getEnumConstants();
for (final BaseEnum e : enums) {
if (Objects.equals(e.getCode(), source)) {
return e;
}
}
} else {
throw new MappingException(String.format(
"Converter %s was used incorrectly. Arguments were: %s and %s",
this.getClass().getSimpleName(), destinationClass.getName(), source
));
}
return null;
}
}
DozerMapperFactory.java (封装一个转换工具, 便于使用)
package com.xxx.xxx.config.dozer;
import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Component
public class DozerMapperFactory {
@Autowired
protected Mapper dozerMapper;
/**
* 单个对象的深度复制及类型转换
* @param source 数据对象
* @param targetClass 复制目标类型
*/
public <T, S> T convert(S source, Class<T> targetClass) {
if (source == null) {
return null;
}
return this.dozerMapper.map(source, targetClass);
}
/**
* list深度复制
* @param sources 数据对象
* @param targetClass 复制目标类型
*/
public <T, S> List<T> convert(List<S> sources, Class<T> targetClass) {
if (sources == null) {
return null;
}
List<T> list = new ArrayList<T>();
for (S source : sources) {
list.add(this.dozerMapper.map(source, targetClass));
}
return list;
}
/**
* set深度复制
* @param sources 数据对象
* @param targetClass 复制目标类型
*/
public <T, S> Set<T> convert(Set<S> sources, Class<T> targetClass) {
if (sources == null) {
return null;
}
Set<T> set = new HashSet<T>();
for (S source : sources) {
set.add(this.dozerMapper.map(source, targetClass));
}
return set;
}
/**
* 数组深度复制
* @param sources 数据对象
* @param targetClass 复制目标类型
*/
public <T, S> T[] convert(S[] sources, Class<T> targetClass) {
if (sources == null) {
return null;
}
@SuppressWarnings("unchecked")
T[] array = (T[]) Array.newInstance(targetClass, sources.length);
for (int i = 0; i < sources.length; i++) {
array[i] = this.dozerMapper.map(sources[i], targetClass);
}
return array;
}
}
resource中xml配置文件
dozer/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>
<custom-converters>
<converter type="com.xxx.xxx.config.dozer.DozerEnumConverter">
<class-a>com.xxx.xxx.enums.BaseEnum</class-a>
<class-b>java.lang.Integer</class-b>
</converter>
</custom-converters>
</configuration>
</mappings>
dozer/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">
<mapping>
<class-a>com.xxx.xxx.entity.User</class-a>
<class-b>com.xxx.xxx.model.UserModel</class-b>
<field>
<a>id</a>
<b>userId</b>
</field>
</mapping>
</mappings>
dozer的配置到这里就结束了