mapstruct 类使用继承时产生Ambiguous mapping methods found for mapping collection element to错误解决

it2024-11-15  2

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> { /** * boToDto * * @param bo 领域业务对象 * @return Dto转换对象 */ Dto boToDto(Bo bo); }

实现转换类

@Mapper(componentModel = "spring") public interface ClassConvertor extends BaseConvertor<ClassDto, ClassDo, ClassBo, ClassParam> { /** * boToClassWithStudentsDto * * @param bo 领域业务对象 * @return ClassWithStudentsDto dto转换对象 */ 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); }
最新回复(0)