MapStruct 使用注意

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 类不是同一个类。

卒!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值