po、dto、vo、bo这些bean,在项目里面的转换还是挺麻烦且无趣的,这时候我们可以使用dozer,它可以帮我们自动的完成相同属性名称的复制,如果属性名称不同或类型不同,我们可以在xml里面定义映射关系。
***
#### 添加依赖:
```xml
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
```
---
#### 在resources/spring下添加spring-dozer.xml
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
default-autowire="byName" default-lazy-init="false">
<bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list>
<value>classpath*:dozer/dozer-mapping.xml</value>
</list>
</property>
</bean>
</beans>
```
---
#### 在resources/dozer下添加dozer-mapping.xml,设置对应的映射关系
```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 date-format="yyyy-MM-dd" >
<class-a>com.neptuno.javat.domain.bo.ArticleBo</class-a>
<class-b>com.neptuno.javat.domain.ArticleDTO</class-b>
<field relationship-type="cumulative">
<a>category</a>
<b>category1</b>
<a-hint>com.neptuno.javat.domain.Category</a-hint>
<b-hint>com.neptuno.javat.domain.Category</b-hint>
</field>
</mapping>
</mappings>
```
添加了两个对应的类的映射,其中一个字段为category,另一个为category1,名字不一样
名字一样的属性,是自动映射的,不必在xml里面指出
---
#### 使用:
```java
@Autowired
Mapper mapper;
List<ArticleDTO> collect = articleBos.stream().map(a -> {
return mapper.map(a, ArticleDTO.class);
}).collect(Collectors.toList());
```
我们遍历一遍articleBos,然后都使用mapper.map来将bo转换为dto
应该是大功告成了吧,我们输出结果看一下
#### ???为啥其他的属性都已经复制了,但是我们指定的category并没有复制过来,输出为null,难道是我打开方式出现了问题?我是按着文档来做的呀
这里我推测是之前指定的xml并没有被导入进来,导致了映射关系并没有被建立,无赖只能谷歌
---
#### 我们建立一个config,来设置mapper
```
/**
* Created by 程旭敏 on 2019/2/27.
*/
@Configuration
public class MapperConfig {
@Bean
public Mapper mapper() {
List files = new ArrayList<>();
files.add("dozer/dozer-mapping.xml");
DozerBeanMapper mapper = new DozerBeanMapper();
mapper.setMappingFiles(files);
return mapper;
}
}
```
这里我们使用了一个list,然后添加mapper的xml,调用:``mapper.setMappingFiles(files);``来给mapper指定映射关系。
---
启动!输出正确的结果!开启steam!
网友评论