有自己思想,拒绝纯复制黏贴!!!
有自己思想,拒绝纯复制黏贴!!!
有自己思想,拒绝纯复制黏贴!!!
这里说个题外话,现在网上有一种现象让我深恶痛绝,就是很多网友对别人所发的博文不加验证,便进行纯复制转发,我很想知道,转发了之后意义在哪?自己都没有去验证所转发的内容是否有效便进行纯复制转发,你们这是在污染网络环境,每次我遇到问题,网上一搜,搜索引擎前面几页一模一样的答案,而且还不是有效的博文,看着这些千篇一律的东西,真的是让我抓狂!!!小小吐槽一下
----------------------------------------------------------------------------------以下是正文-----------------------------------------------------------------------------------
简单说一下MapStruct是什么?
MapStruct是一个映射框架,专门用来处理类与类之间的属性映射的,比如entity类与DTO类的属性映射。
我们只需要定义好mapper接口,在编译项目的时候MapStruct就会自动帮我们实现这个映射接口,避免了麻烦复杂的映射实现。
如需了解更多MapStruct的内容请自行百度,本文只是解决使用Mapstruct时出现的问题。
报错信息如下:
java: Ambiguous mapping methods found for mapping collection element to java.lang.Object:
com.tortoise.iot.tenant.rest.product.vo.SpuAttributeVO r2v(com.tortoise.iot.tenant.rest.product.request.SpuAttributeRequest arg0),
com.tortoise.iot.product.api.dto.SpuAttributeDTO r2d(com.tortoise.iot.tenant.rest.product.request.SpuAttributeRequest arg0).
自定义的mapper接口如下:
详细检查之后发现,虽然我定义好了SpuAttributeRestConverter映射接口,但项目编译后,MapStruct并没有自动帮我实现这个映射接口,即没有生成SpuAttributeRestConverterImpl类。
一开始,映射接口可以正常自动生成对应的实现类,但当我对原有的entity类、DTO类等里的字段进行修改后,便出现了这个问题,网友说MapStruct框架与Lombok框架同时使用会存在一些bug,其中一个就是我的这种情况,即修改类的字段后重新编译,MapStruct并不会自动生成新的实现类,需要我们把旧的实现类删掉,重新编译才会生成修改字段后对应的那个实现类,然而这个方法并不能解决我的问题。
在未修改字段之前,是可以自动生成实现类的,说明自定义的映射接口应该没有问题,不过保险起见,我还是检查了一下,确实没发现问题,那么问题估计就出在我修改那些字段上了,果不其然,还真是!
所做的修改如下:
SpuAttributeDTO类 ———— 增加了一个属性private List< SpuAttributeValueDTO > values;
SpuAttributeRequest类 ———— 增加了一个属性private List< SpuAttributeRequest > values;
SpuAttributeVO类 ———— 增加了一个属性private List< SpuAttributeValueVO > values;
… …
仔细一对比,你们就会发现SpuAttributeRequest类新增的属性写错了,本应该是SpuAttributeValueRequest,却粗心写成了SpuAttributeRequest,改过来之后就不报错了。