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 org.mapstruct mapstruct-processor ${org.mapstruct.version}
Maven插件必不可少,格式也是固定的。
简单示例
有一个实体类-用户User
publicclassUser{ privateintid; privateStringname; privatebooleanmarried; //setters,getters,toString }
有一个实体类-雇员Employee,雇员也是用户,只是比用户多一个属性-职位position
publicclassEmployee{ privateintid; privateStringname; privateStringposition; privatebooleanmarried; //setters,getters,toString }
在具体业务场景下,需要User对象转换为Employee对象,有时候需要Employee对象转换为User对象。
使用MapStrut的话,需要写一个接口:
@Mapper publicinterfaceUserMapper{ UserMapperINSTANCE=Mappers.getMapper(UserMapper.class); EmployeeuserToEmployee(Useruser); UseremployeeToUser(Employeeemployee); }
运行示例
首先需要mvncompile,自动生成转换代码。生成的代码放在target/annotations下面。大致代码如下:
importcom.training.mapstrut.model.Employee; importcom.training.mapstrut.model.User; importjavax.annotation.Generated; @Generated( value="org.mapstruct.ap.MappingProcessor", date="2017-08-26T17:08:23+0800", comments="version:1.2.0.CR1,compiler:javac,environment:Java1.8.0_92(OracleCorporation)" ) publicclassUserMapperImplimplementsUserMapper{ @Override publicEmployeeuserToEmployee(Useruser){ if(user==null){ returnnull; } Employeeemployee=newEmployee(); employee.setId(user.getId()); employee.setName(user.getName()); employee.setMarried(user.isMarried()); returnemployee; } @Override publicUseremployeeToUser(Employeeemployee){ if(employee==null){ returnnull; } Useruser=newUser(); user.setId(employee.getId()); user.setName(employee.getName()); user.setMarried(employee.isMarried()); returnuser; } }
简单的写个测试类实验一下。
publicclassAppTest{ @Test publicvoidappTest(){ Useruser=newUser(); user.setId(125); user.setName("Chao"); user.setMarried(false); Employeee=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下,需要M2Eplug-in的支持,如果Eclipse中没有集成,需要去EclipseMarketplace中下载安装,有时候还需要指定下面的配置在pom.xml的properties中,以启用AnnotationProcessing
3.在Eclipse下,Mavencompile提示Nothingtocompile-allclassesareuptodate,你可以试一下在Golds中填写cleaninstallcompile。
4.Maven编译的时候,必须使用JDK,不能使用JRE,且版本要高于jdk6.
5.在Eclipse中,确定已经生成了*MapperImpl.java,但是运行时报错ClassNotFoundException:Cannotfindimplementationforcom...*Mapper
在项目上右键–>properties–>JavaCompiler–>AnnotationProcessing(Enable所有项)–>FactoryPath(Enable)–>AddExternalJARS–>选择mapstruct-processor-*.jar(大概在计算机的目录.m2\repository\org\mapstruct\mapstruct-processor)–>OK
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。