您好,登錄后才能下訂單哦!
摘要: 在實際項目中,我們經常需要將PO轉DTO、DTO轉PO等一些實體間的轉換。比較出名的有BeanUtil 和ModelMapper等,它們使用簡單,但是在稍顯復雜的業務場景下力不從心。MapStruct這個插件可以用來處理domin實體類與model類的屬性映射,可配置性強。
建立Maven項目
MapStruct需要醒目構建工具(如Maven)支持,如果項目結構不標準,可能無法生成對應的轉換類。這里我使用Maven構建工程。
<properties> <org.mapstruct.version>1.2.0.CR1</org.mapstruct.version> </properties>
MapStruct是一個一直在進步的工具,后面的版本不斷改進之前版本的不足,修復之前版本的bug,使用的時候最好最新的穩定版。
<dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>${org.mapstruct.version}</version> </dependency> </dependencies>
需要引入的依賴包,可以看到使用到了java8,最新版甚至已經支持了java9。當然這不以為著你必須使用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插件必不可少,格式也是固定的。
簡單示例
有一個實體類-用戶User
public class User { private int id; private String name; private boolean married; // setters, getters, toString }
有一個實體類-雇員Employee,雇員也是用戶,只是比用戶多一個屬性-職位position
public class Employee { private int id; private String name; private String position; private boolean married; // setters, getters, toString }
在具體業務場景下,需要User 對象轉換為Employee對象,有時候需要Employee對象轉換為User對象。
使用MapStrut的話,需要寫一個接口:
@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); Employee userToEmployee(User user); User employeeToUser(Employee employee); }
運行示例
首先需要mvn compile
,自動生成轉換代碼。生成的代碼放在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; } }
簡單的寫個測試類實驗一下。
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()); } }
結果輸出:
Employee [id=125, name=Chao, position=null, married=false]
效果不錯,需要轉換的字段都準確無誤,不過有人要吐糟了,這樣的用法比BeanUtil 復雜多了,還只是達到相同的效果。這種簡單的轉化確實不需要MapStruct,它要做的是更為復雜的業務場景。
MapStruct問題
1.MapStruct轉換不準確。
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中,確定已經生成了*MapperImpl.java,但是運行時報錯ClassNotFoundException: Cannot find implementation for com...*Mapper
在項目上右鍵 – > properties – > Java Compiler – > Annotation Processing (Enable 所有項) – > Factory Path (Enable) – > Add External JARS – > 選擇
mapstruct-processor-*.jar
(大概在計算機的目錄.m2\repository\org\mapstruct\mapstruct-processor
) – > OK
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。