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

使用MapStruct转换后新ArrayList中所有值为null的问题排查

MapStruct映射后字段值丢失问题排查

问题描述

使用MapStruct 1.5.5 Final通过两个对象的字段创建新列表,生成的列表字段齐全但所有值都丢失,未使用Lombok的Getter和Setter。

代码示例

public static void main(String[] args) {
    FhExtra fhExtra = new FhExtra();
    fhExtra.setLoanNumber("123456");
    fhExtra.setFILoanNumber("896");
    FhExtraImportResults extraImportResults1 = new FhExtraImportResults();
    extraImportResults1.setLoanId(56L);
    extraImportResults1.setRecord(fhExtra);
    List<FhExtraImportResults> extraImportResults = new ArrayList<>();
    extraImportResults.add(extraImportResults1);

    FhListItemMapper mapper = Mappers.getMapper(FhListItemMapper.class);
    List<FhlbExtraCsv> newList = extraImportResults.stream().map(mapper::map).toList();
    // newList字段齐全但无设置的值
}

@Mapper
public interface FhListItemMapper {
    @Mapping(target = "loanId", source = "results.loanId")
    @Mapping(target = "error", source = "results.error")
    FhlbExtraCsv map(FhlbExtraImportResults results);
}

public class FhExtra {
    String LoanNumber;
    String FILoanNumber;
}

public class FhlbExtraImportResults {
    FhExtra record;
    String error;
    Long loanId;
}

public class FhlbExtraCsv {
    String LoanNumber;
    String FILoanNumber;
    String error;
    Long loanId;
}

预期输出

[
 {
 "LoanNumber": "123456",
 "FILoanNumber": "896",
 "error": null,
 "loanId": 56
 }
]

问题原因及解决方法

1. 缺少Getter/Setter方法

MapStruct默认遵循JavaBean规范,依赖Getter方法读取源对象字段值,依赖Setter方法设置目标对象字段值。你的实体类均未提供对应的Getter/Setter,导致MapStruct无法访问和赋值字段。

解决:给所有实体类添加Getter/Setter
以FhExtra为例:

public class FhExtra {
    String LoanNumber;
    String FILoanNumber;

    public String getLoanNumber() {
        return LoanNumber;
    }

    public void setLoanNumber(String loanNumber) {
        LoanNumber = loanNumber;
    }

    public String getFILoanNumber() {
        return FILoanNumber;
    }

    public void setFILoanNumber(String FILoanNumber) {
        this.FILoanNumber = FILoanNumber;
    }
}

同理给FhlbExtraImportResults和FhlbExtraCsv添加对应的Getter/Setter方法。

2. 嵌套字段映射规则缺失

当前Mapper仅配置了loanId和error的映射,但FhlbExtraCsv中的LoanNumber和FILoanNumber来自FhlbExtraImportResults的record嵌套对象,未配置映射规则。

解决:补充嵌套字段映射配置
修改FhListItemMapper,添加嵌套字段的映射规则:

@Mapper
public interface FhListItemMapper {
    @Mapping(target = "loanId", source = "results.loanId")
    @Mapping(target = "error", source = "results.error")
    @Mapping(target = "LoanNumber", source = "results.record.LoanNumber")
    @Mapping(target = "FILoanNumber", source = "results.record.FILoanNumber")
    FhlbExtraCsv map(FhlbExtraImportResults results);
}

或者使用批量映射简化配置(适用于字段名完全匹配的情况):

@Mapper
public interface FhListItemMapper {
    @Mapping(target = ".", source = "results.record")
    @Mapping(target = "loanId", source = "results.loanId")
    @Mapping(target = "error", source = "results.error")
    FhlbExtraCsv map(FhlbExtraImportResults results);
}

内容的提问来源于stack exchange,提问作者VKP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:53:15