關於transfer的一些問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章