1.在springboot中的配置
//扫描classpath 下的 *mapping.xml文件 支持多级扫描
dozer/mini
dozer/back
@Configuration
public class DozerConfig {
@Bean
public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer/**/*.xml") Resource[] resources) throws Exception {
final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
dozerBeanMapperFactoryBean.setMappingFiles(resources);
return dozerBeanMapperFactoryBean;
}
}
2.使用方式
//使用的时候直接注入
@Autowired
protected Mapper mapper;
3.使用列子
例子1.相互拷贝
com.xx.xx.a类
private string name;
private Integer age;
com.xxx.xxx.b类
private string name;
private Integer ageTwo;
这两个类的属性名有差异 只要有差异就需要配置
mapping 每一个类的都得使用
class-a 代表源
class-b 代表目标类
filed 代表 类的属性 (字段)
a:填写源
b:填写目标
<?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.xx.xx.a</class-a>
<class-b>com.xxx.xxx.b</class-b>
<field>
<a>age</a>
<b>ageTwo</b>
</field>
</mapping>
</mappings>
4.多层级拷贝
1.源实体类
CartEntity
public class CartEntity{
private Float total;
private Set<GoodsEntity> items = new HashSet<>();
}
GoodsEntity
public class GoodsEntity extends BaseEntity {
private Integer count;
private Float fact_total;
private Float price;
private Integer checked;
private GoodsTypeType type;
private ProductEntity product;
}
ProductEntity
public class ProductEntity extends BaseEntity {
private String sn;
private String title;
private String code;
private String bigImage;
private String smallImage;
private String gallery;
private Float price_retail;
private CategoryEntity category;
}
2.目标实体类
CartVo
public class CartVO {
//购物车的总价
private Float total;
//购物车的商品总数量
private Integer count;
//购物车全选/全不选标识
private Integer checkedAllStatus;
//购物车的所有商品项
private List<GoodsVO> items= new ArrayList<GoodsVO>();
}
GoodsVO
public class GoodsVO {
private String sn;
private Integer count;
private Float total;
private Float price;
private String title;
private String smallImage;
private Integer checked;
}
3.多层级xml配置
大体逻辑就是
把CartEntity 中的items属性拷贝到CartVo中的items属性
但是两者中的items又是属性尽不相同
所以进行了多层级配置
<?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.aui.stock.entity.CartEntity</class-a>
<class-b>com.aui.stock.controller.mini.vo.CartVO</class-b>
<field>
两个字段
<a>items</a>
<b>items</b>
//两个字段对应的实体类
<a-hint>com.aui.stock.entity.GoodsEntity</a-hint>
<b-hint>com.aui.stock.controller.mini.vo.GoodsVO</b-hint>
</field>
</mapping>
//重新创建了一个mapping 用来创建两个字段对应的实体类
<mapping>
<class-a>com.aui.stock.entity.GoodsEntity</class-a>
<class-b>com.aui.stock.controller.mini.vo.GoodsVO</class-b>
<!-- <field>
<a>product</a>
<b>productVO</b>
</field>-->
//这里是 将product中的sn属性赋值给GoodsVO的sn属性
<field>
<a>product.sn</a>
<b>sn</b>
</field>
<field>
<a>product.price_retail</a>
<b>price</b>
</field>
<field>
<a>product.title</a>
<b>title</b>
</field>
<field>
<a>product.smallImage</a>
<b>smallImage</b>
</field>
<!-- <field>
<a>product</a>
<b>productVo</b>
<a-hint>com.aui.stock.entity.ProductEntity</a-hint>
<b-hint>com.aui.stock.controller.mini.vo.ProductVO</b-hint>
</field>-->
</mapping>
</mappings>
//调用map方法就可以了
CartVo cartVo=mapper.map(cartEntity,CartVO.class);
注意地方:
//切记不可重复配置类的映射关系 否则会报错 ,这些配置的映射关系 DOZER会重复利用的
//错误信息
Duplicate Class Mapping Found. Source
找到重复的类映射。来源