<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)