MapStruct实体间转换的简单用法

网友投稿 346 2023-01-11


MapStruct实体间转换的简单用法

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

建立Maven项目

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

1.2.0.CR1

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

org.mapstruct

mapstruct-jdk8

${org.mapstruct.version}

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

org.apache.maven.plugins

maven-compiler-plugin

3.5.1

1.8

1.8

org.mapstruct

mapstruct-processor

${org.mapstruct.version}

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的话,需要写一个接口:

djluUjjaFQ@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 userdjluUjjaFQToEmployee(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

jdt_apt

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-prhttp://ocessor) – > OK

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口测试用例怎么做(接口测试用例怎么做分析)
下一篇:装备经以太网接口测试(以太网测试设备)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~