mapstrcut Ambiguous mapping错误解决
mapstrcut介绍 (采自[官网](https://mapstruct.org/))mapstrcut是什么为什么要用mapstrcut
说明代码实体代码Bo 实体Dto 实体基础转换类实现转换类错误解决
mapstrcut介绍 (采自官网)
mapstrcut是什么
MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 生成的映射代码使用简单的方法调用,因此快速,类型安全且易于理解。
为什么要用mapstrcut
多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写此类映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过使其尽可能自动化来简化这项工作。 与其他映射框架相比,MapStruct在编译时生成Bean映射,从而确保了高性能,允许快速的开发人员反馈和彻底的错误检查。
说明
在ddd实践中, dto实体有单独Dto, 有包含子域Dto的Dto根集对象, 此时采用继承的方式去复用dto内容, 在mapstrcut进行转换时, 抛出异常
java
: Ambiguous mapping methods found
for mapping collection element to
代码
实体代码
Bo 实体
@Data
@Accessors(chain
= true)
public class ClassBo implements Serializable {
private static final long serialVersionUID
= 1L
;
private Long id
;
private List
<StudentBo> studentList
;
}
@Data
@Accessors(chain
= true)
public class StudentBo implements Serializable {
private static final long serialVersionUID
= 1L
;
private Long id
;
}
Dto 实体
@Data
@Accessors(chain
= true)
public class ClassDto implements Serializable {
private static final long serialVersionUID
= 1L
;
private Long id
;
}
@Data
@Accessors(chain
= true)
public class StudentDto implements Serializable {
private static final long serialVersionUID
= 1L
;
private Long id
;
}
@Data
@Accessors(chain
= true)
public class ClassWithStudentDto implements Serializable {
private static final long serialVersionUID
= 1L
;
private Long id
;
private List
<StudentDto> studentList
;
}
基础转换类
public interface BaseConvertor<Dto, Do, Bo, Param> {
Dto
boToDto(Bo bo
);
}
实现转换类
@Mapper(componentModel
= "spring")
public interface ClassConvertor extends BaseConvertor<ClassDto, ClassDo, ClassBo, ClassParam> {
ClassWithStudentsDto
boToClassWithStudentsDto(Bo bo
);
}
错误
此时产生错误
java
: Ambiguous mapping methods found
for mapping collection element to ClassDto
: ClassDto
boToDto(ClassBo bo
), ClassWithStudentsDto
boToClassWithStudentsDto(ClassBo classBo
)
解决
public interface BaseConvertor<Dto, Do, Bo, Param> {
@Named(value
= "boToDto")
Dto
boToDto(Bo bo
);
}
public interface ClassConvertor extends BaseConvertor<ClassDto, ClassDo, ClassBo, ClassParam> {
ClassWithStudentsDto
boToClassWithStudentsDto(Bo bo
);
}