由于对 mapstruct 仅会用点皮毛,当时以为碰到了一个诡异的 bug,后面排查发现是由于 default 方法使用不当。
下面还原下场景
@Data
public class User {
private Long id;
private String name;
private String className;
private int age;
private Date arriveTime;
}
converter 类似这样
@Mapper
public interface UserConverter {
@Mapping(target = "className", expression = "java(getClassNameFun(userPO.getClassName()))")
User to(UserPO userPO);
default String getClassNameFun(String className) {
return "光明路小学" + className;
}
}
后面联调发现名称字段被覆盖了,和班级名称一模一样,然后去检查注解是否写错。后续去检查 mapstruct 生成的实现类发现 setName 也调用了 getClassNameFun 方法,所以导致被覆盖。