MapStruct实体间转换

女爷i 2022-06-09 01:11 301阅读 0赞

摘要: 在实际项目中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。

建立Maven项目

MapStruct需要醒目构建工具(如Maven)支持,如果项目结构不标准,可能无法生成对应的转换类。这里我使用Maven构建工程。

  1. <properties>
  2. <org.mapstruct.version>1.2.0.CR1</org.mapstruct.version>
  3. </properties>

MapStruct是一个一直在进步的工具,后面的版本不断改进之前版本的不足,修复之前版本的bug,使用的时候最好最新的稳定版。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mapstruct</groupId>
  4. <artifactId>mapstruct-jdk8</artifactId>
  5. <version>${org.mapstruct.version}</version>
  6. </dependency>
  7. </dependencies>

需要引入的依赖包,可以看到使用到了java8,最新版甚至已经支持了java9。当然这不以为着你必须使用java8,java版本高于java6都是可以的。

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <version>3.5.1</version>
  7. <configuration>
  8. <source>1.8</source>
  9. <target>1.8</target>
  10. <annotationProcessorPaths>
  11. <path>
  12. <groupId>org.mapstruct</groupId>
  13. <artifactId>mapstruct-processor</artifactId>
  14. <version>${org.mapstruct.version}</version>
  15. </path>
  16. </annotationProcessorPaths>
  17. </configuration>
  18. </plugin>
  19. </plugins>
  20. </build>

Maven插件必不可少,格式也是固定的。

简单示例

有一个实体类-用户User

  1. public class User {
  2. private int id;
  3. private String name;
  4. private boolean married;
  5. // setters, getters, toString

有一个实体类-雇员Employee,雇员也是用户,只是比用户多一个属性-职位position

  1. public class Employee {
  2. private int id;
  3. private String name;
  4. private String position;
  5. private boolean married;
  6. // setters, getters, toString
  7. }

在具体业务场景下,需要User 对象转换为Employee对象,有时候需要Employee对象转换为User对象。

使用MapStrut的话,需要写一个接口:

  1. @Mapper
  2. public interface UserMapper {
  3. UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
  4. Employee userToEmployee(User user);
  5. User employeeToUser(Employee employee);
  6. }

运行示例

首先需要mvn compile,自动生成转换代码。生成的代码放在target/annotations下面。大致代码如下:

  1. import com.training.mapstrut.model.Employee;
  2. import com.training.mapstrut.model.User;
  3. import javax.annotation.Generated;
  4. @Generated(
  5. value = "org.mapstruct.ap.MappingProcessor",
  6. date = "2017-08-26T17:08:23+0800",
  7. comments = "version: 1.2.0.CR1, compiler: javac, environment: Java 1.8.0_92 (Oracle Corporation)"
  8. )
  9. public class UserMapperImpl implements UserMapper {
  10. @Override
  11. public Employee userToEmployee(User user) {
  12. if ( user == null ) {
  13. return null;
  14. }
  15. Employee employee = new Employee();
  16. employee.setId( user.getId() );
  17. employee.setName( user.getName() );
  18. employee.setMarried( user.isMarried() );
  19. return employee;
  20. }
  21. @Override
  22. public User employeeToUser(Employee employee) {
  23. if ( employee == null ) {
  24. return null;
  25. }
  26. User user = new User();
  27. user.setId( employee.getId() );
  28. user.setName( employee.getName() );
  29. user.setMarried( employee.isMarried() );
  30. return user;
  31. }
  32. }

简单的写个测试类实验一下。

  1. public class AppTest{
  2. @Test
  3. public void appTest(){
  4. User user = new User();
  5. user.setId(125);
  6. user.setName("Chao");
  7. user.setMarried(false);
  8. Employee e = UserMapper.INSTANCE.userToEmployee(user);
  9. System.out.println(e);
  10. Assert.assertFalse(e.isMarried());
  11. }
  12. }

结果输出:
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

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MapStruct实体转换

    摘要: 在实际项目中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场