MapStruct实现不同数据类型的Student类与DTO类映射求助
MapStruct 实现 StudentDTO 到 Student 的完整映射方案
针对你遇到的AcademicDTO(含Double、Long类型)到Academic(全String类型)的转换问题,以下是完整的映射器实现:
1. 核心映射器接口
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Named; import org.mapstruct.factory.Mappers; @Mapper public interface StudentMapper { StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class); // 处理StudentDTO到Student的映射,指定字段名对应关系 @Mapping(source = "personal", target = "personalInfo") Student studentDtoToStudent(StudentDTO studentDTO); // 复用你已实现的PersonalDTO到PersonalInfo的映射逻辑 PersonalInfo personalDtoToPersonalInfo(PersonalDTO personalDTO); // 处理AcademicDTO到Academic的映射,绑定自定义类型转换方法 @Mapping(source = "score", target = "score", qualifiedByName = "doubleToString") @Mapping(source = "grade", target = "grade", qualifiedByName = "longToString") Academic academicDtoToAcademic(AcademicDTO academicDTO); // 自定义Double转String方法,处理null场景 @Named("doubleToString") default String doubleToString(Double value) { return value != null ? String.valueOf(value) : ""; } // 自定义Long转String方法,处理null场景 @Named("longToString") default String longToString(Long value) { return value != null ? String.valueOf(value) : ""; } }
2. 关键细节说明
- 字段名映射:
StudentDTO中的personal字段与Student中的personalInfo字段名不一致,通过@Mapping注解明确对应关系。 - 类型转换控制:通过
@Named标记自定义转换方法,再用qualifiedByName指定映射时使用该方法,避免默认转换可能出现的空指针或不符合预期的字符串格式。 - 集合自动映射:MapStruct会自动复用单个
AcademicDTO到Academic的转换逻辑,无需额外编写List<AcademicDTO>到List<Academic>的转换方法。
3. 使用示例
public class MappingTest { public static void main(String[] args) { // 构造测试数据 PersonalDTO personalDTO = new PersonalDTO(); personalDTO.setName("张三"); personalDTO.setAddress("北京市朝阳区"); AcademicDTO academicDTO = new AcademicDTO(); academicDTO.setSubject("数学"); academicDTO.setScore(95.5); academicDTO.setGrade(100L); StudentDTO studentDTO = new StudentDTO(); studentDTO.setPersonal(personalDTO); studentDTO.setAcademics(List.of(academicDTO)); // 执行映射 Student student = StudentMapper.INSTANCE.studentDtoToStudent(studentDTO); System.out.println(student); } }
内容的提问来源于stack exchange,提问作者Amr4AOT
相关产品推荐
相关产品推荐

