MapStruct 应该很多人都使用过,或者正在使用。不得不说,作为一个Java Bean 转换的工具,他表现的很出色:1. 功能强大 2. 编译时插件,不会导致代码运行时额外的耗时开销 3.很容易上手。但是呢,如果使用的过程中不注意细节也是经常会出现问题的。记录一下今天使用的过程中遇到的一个由细节导致的问题。(千里之堤毁于蚁穴……)
场景:
项目内部有两个类 A、B如下:
public Class A {
private B b;
private String name;
……
}
public class B {
private Integer amout;
……
}
项目外部有三个类 A1、com.xxx.B1、com.yy.B1 如下:
public Class A1 {
// 注意: 此处 B1 是 com.xxx.B1
private B1 b;
private String name;
……
}
com.xxx.B1:
public class B1 {
private Integer amout;
……
}
com.yy.B1:
public class B1 {
private Integer amout;
……
}
我现在要做的事情呢,就是要讲项目外部类 A1、B1 转换成 项目内部类 A、B
于是乎,开始做法。按照 MapStruct 的使用方法,创建了 AMppper、BMapper 接口
@Mapper(uses = {BMapper.class})
public interface AMapper {
AMapper INSTANCE = Mappers.getMapper(AMapper.class);
A convertInfo(A1 a1);
}
@Mapper
public interface BMapper {
// 注意,此处 B1 引入的是 com.yy.B1
B convertInfo(B1 b1);
}
然后,编译一下代码,以为 大功告成,美滋滋。编译完成之后,看了一下生成的 类,发现咦!实现类里 没有 BMapper !
pulic class AMapperImpl implements AMapper{
@Override
public A convertInfo(A1 a1) {
if ( a1 == null ) {
return null;
}
A a = new A();
// …… 此处省略五千字,付费可看,咳咳
return a;
}
}
期望的应该是这样的:
pulic class AMapperImpl implements AMapper{
private final BMapper bMapper = Mappers.getMapper(BMapper.class);
@Override
public A convertInfo(A1 a1) {
if ( a1 == null ) {
return null;
}
A a = new A();
// …… 此处省略五千字
a.setB(bMapper.convert(a1.getB1()));
return a;
}
}
为什么会这样呢?来,我们5个WHY 走起……
……
原来如此,A1 类中引入的 B1 类和 BMapper 中的convertInfo方法入参 B1 类不是同一个类。
卒!