<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Beta2</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Beta2</version>
</dependency>
transfer如果是相同对象进行复制,则是浅拷贝,如:
Transfer.java
List<User> user2User(List<User> user);
A.java
User user = new User().setName("ccc").setAge(19);
List<User> list = new ArrayList<>();
list.add(user);
List<User> user1 = transfer.user2User(list);
//当user1更改时,user也会更改
user1.get(0).setName("bbbb");
user.getName();//此时值为bbbb
我们查看源码就会发现相同对象进行复制并不会重新new一个新的对象再复制
如果两个对象属性名不相同,想要相互进行映射就要使用@Mappings
注解
Transfer.java
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring", uses = {})
public interface Transfer {
/**
* @Mapping中参数source指方法参数的属性,target指需要转换的属性
*/
@Mappings({
@Mapping(source = "source.name", target = "myName"),
@Mapping(source = "source.age", target = "myAge")
})
public Target source2Target(Source source);
}
另外还有一种更复杂的需求,我们希望根据Source的id属性找到它的name,再将name赋值给Target的myName属性,这时就要再添加一个方法(getNameById):
@Autowired
private SourceService sourceService;
@Mappings({
@Mapping(source = "source.id", target = "myName"),
@Mapping(source = "source.age", target = "myAge")
})
public Target source2Target(Source source);
public String getNameById(Long id) {
if (id != null) {
return sourceService.getNameById(id);
}
return null;
}
此时就要把类从接口改成抽象类(abstract)