You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:22:29