在本文中,我们将探讨 MapStruct 的使用, 简而言之 就是Java Bean映射器。
该API包含可在两个Java Bean之间自动映射的功能。使用MapStruct,我们只需要创建接口,该库将在编译时自动创建具体的实现。
对于大多数应用程序,您会注意到很多将POJO转换为其他POJO的样板代码。
例如,一种常见的转换类型发生在持久性支持的实体和发往客户端的DTO之间。
这就是MapStruct解决的问题–手动创建bean映射器非常耗时。该库可以自动生成bean映射器类。
让我们将以下依赖项添加到我们的Maven pom.xml中:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.3.0.Beta2</version> </dependency>
让我们还将批注处理程序路径添加到maven-compiler-plugin插件的配置部分。这里所述mapstruct处理器用于生成在生成过程中映射器实现:
<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>1.3.0.Beta2</version> </path> </annotationProcessorPaths> </configuration> </plugin>
映射到DTO对象
源实体:
<b>public</b> <b>class</b> Employee { <b>private</b> String firstName; <b>private</b> String lastName; <font><i>// constructor, getters and setters</i></font><font> } </font>
DTO目标:
<b>public</b> <b>class</b> EmployeeDTO { <b>private</b> String firstName; <b>private</b> String lastName; <font><i>// getters and setters</i></font><font> } </font>
映射器:
@Mapper <b>public</b> <b>interface</b> EmployeeMapper { List<EmployeeDTO> map(List<Employee> employees); }
这里是将Employee的集合转换为EmployeeDTO的集合类型,如果是两个对象类型直接转更方便。
注意,我们没有为EmployeeMapper 创建实现类-因为MapStruct为我们创建了它。
我们可以通过执行mvn clean install来触发MapStruct处理。输出结果在/target/generated-sources/annotations/目录下。
看看MapStruct 帮我们自动生成的EmployeeMapper 接口实现代码如下:
<b>public</b> <b>class</b> EmployeeMapperImpl implements EmployeeMapper { @Override <b>public</b> List<EmployeeDTO> map(List<Employee> employees) { <b>if</b> (employees == <b>null</b>) { <b>return</b> <b>null</b>; } List<EmployeeDTO> list = <b>new</b> ArrayList<EmployeeDTO>(employees.size()); <b>for</b> (Employee employee : employees) { list.add(employeeToEmployeeDTO(employee)); } <b>return</b> list; } <b>protected</b> EmployeeDTO employeeToEmployeeDTO(Employee employee) { <b>if</b> (employee == <b>null</b>) { <b>return</b> <b>null</b>; } EmployeeDTO employeeDTO = <b>new</b> EmployeeDTO(); employeeDTO.setFirstName(employee.getFirstName()); employeeDTO.setLastName(employee.getLastName()); <b>return</b> employeeDTO; } }
更详细的转换点击标题见原文。