MapStruct實(shí)體間轉(zhuǎn)換的簡單用法
摘要: 在實(shí)際項(xiàng)目中,我們經(jīng)常需要將PO轉(zhuǎn)DTO、DTO轉(zhuǎn)PO等一些實(shí)體間的轉(zhuǎn)換。比較出名的有BeanUtil 和ModelMapper等,它們使用簡單,但是在稍顯復(fù)雜的業(yè)務(wù)場景下力不從心。MapStruct這個插件可以用來處理domin實(shí)體類與model類的屬性映射,可配置性強(qiáng)。
建立Maven項(xiàng)目
MapStruct需要醒目構(gòu)建工具(如Maven)支持,如果項(xiàng)目結(jié)構(gòu)不標(biāo)準(zhǔn),可能無法生成對應(yīng)的轉(zhuǎn)換類。這里我使用Maven構(gòu)建工程。
<properties> <org.mapstruct.version>1.2.0.CR1</org.mapstruct.version> </properties>
MapStruct是一個一直在進(jìn)步的工具,后面的版本不斷改進(jìn)之前版本的不足,修復(fù)之前版本的bug,使用的時候最好最新的穩(wěn)定版。
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
需要引入的依賴包,可以看到使用到了java8,最新版甚至已經(jīng)支持了java9。當(dāng)然這不以為著你必須使用java8,java版本高于java6都是可以的。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
Maven插件必不可少,格式也是固定的。
簡單示例
有一個實(shí)體類-用戶User
public class User {
private int id;
private String name;
private boolean married;
// setters, getters, toString
}
有一個實(shí)體類-雇員Employee,雇員也是用戶,只是比用戶多一個屬性-職位position
public class Employee {
private int id;
private String name;
private String position;
private boolean married;
// setters, getters, toString
}
在具體業(yè)務(wù)場景下,需要User 對象轉(zhuǎn)換為Employee對象,有時候需要Employee對象轉(zhuǎn)換為User對象。
使用MapStrut的話,需要寫一個接口:
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
Employee userToEmployee(User user);
User employeeToUser(Employee employee);
}
運(yùn)行示例
首先需要mvn compile,自動生成轉(zhuǎn)換代碼。生成的代碼放在target/annotations下面。大致代碼如下:
import com.training.mapstrut.model.Employee;
import com.training.mapstrut.model.User;
import javax.annotation.Generated;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2017-08-26T17:08:23+0800",
comments = "version: 1.2.0.CR1, compiler: javac, environment: Java 1.8.0_92 (Oracle Corporation)"
)
public class UserMapperImpl implements UserMapper {
@Override
public Employee userToEmployee(User user) {
if ( user == null ) {
return null;
}
Employee employee = new Employee();
employee.setId( user.getId() );
employee.setName( user.getName() );
employee.setMarried( user.isMarried() );
return employee;
}
@Override
public User employeeToUser(Employee employee) {
if ( employee == null ) {
return null;
}
User user = new User();
user.setId( employee.getId() );
user.setName( employee.getName() );
user.setMarried( employee.isMarried() );
return user;
}
}
簡單的寫個測試類實(shí)驗(yàn)一下。
public class AppTest{
@Test
public void appTest(){
User user = new User();
user.setId(125);
user.setName("Chao");
user.setMarried(false);
Employee e = UserMapper.INSTANCE.userToEmployee(user);
System.out.println(e);
Assert.assertFalse(e.isMarried());
}
}
結(jié)果輸出:
Employee [id=125, name=Chao, position=null, married=false]
效果不錯,需要轉(zhuǎn)換的字段都準(zhǔn)確無誤,不過有人要吐糟了,這樣的用法比BeanUtil 復(fù)雜多了,還只是達(dá)到相同的效果。這種簡單的轉(zhuǎn)化確實(shí)不需要MapStruct,它要做的是更為復(fù)雜的業(yè)務(wù)場景。
MapStruct問題
1.MapStruct轉(zhuǎn)換不準(zhǔn)確。
MapStruct一直在更新,一些特性在舊版本中無法識別,在使用的時候最要使用比較新的版本。
2.在Eclipse下,需要M2E plug-in的支持,如果Eclipse中沒有集成,需要去Eclipse Marketplace中下載安裝,有時候還需要指定下面的配置在pom.xml的properties中,以啟用Annotation Processing
<m2e.apt.activation>jdt_apt</m2e.apt.activation>
3.在Eclipse下,Maven compile提示Nothing to compile - all classes are up to date,你可以試一下在Golds中填寫clean install compile。
4.Maven 編譯的時候,必須使用JDK,不能使用JRE,且版本要高于jdk6.
5.在Eclipse中,確定已經(jīng)生成了*MapperImpl.java,但是運(yùn)行時報(bào)錯ClassNotFoundException: Cannot find implementation for com...*Mapper 在項(xiàng)目上右鍵 – > properties – > Java Compiler – > Annotation Processing (Enable 所有項(xiàng)) – > Factory Path (Enable) – > Add External JARS – > 選擇
mapstruct-processor-*.jar(大概在計(jì)算機(jī)的目錄.m2\repository\org\mapstruct\mapstruct-processor) – > OK
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
springboot X-Accel-Redirect 大文件下載實(shí)現(xiàn)
本文主要介紹了springboot X-Accel-Redirect 大文件下載實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼
這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
java中struts2實(shí)現(xiàn)文件上傳下載功能
這篇文章主要介紹了java中struts2實(shí)現(xiàn)文件上傳下載功能的方法,以實(shí)例形式分析了struts2文件上傳下載功能的實(shí)現(xiàn)技巧與相關(guān)問題,具有一定的參考借鑒價值,需要的朋友可以參考下2016-05-05
springBoot使用openfeign來遠(yuǎn)程調(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了springBoot使用openfeign來遠(yuǎn)程調(diào)用的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java組件FileUpload上傳文件實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java組件FileUpload上傳文件實(shí)現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-06-06

