使用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
相关产品推荐
相关产品推荐

