Model Mapper映射同属性名异类型类时仅单字段成功问题排查
ModelMapper仅映射一个字段的原因及解决方法
问题场景
现有两个类:
public class Transaction { private TransactionType paymentType; private TransactionStatus status; }
public class TransactionDetails { private String paymentType; private String status; }
使用ModelMapper将List<Transaction>映射为List<TransactionDetails>:
Type listType = new TypeToken<List<TransactionDetails>>(){}.getType(); List<TransactionDetails> transactionDetailsList = modelMapper.map(transaction, listType);
结果仅paymentType成功映射为"CASH",status为null。
核心原因
大概率是**TransactionStatus枚举的字符串转换规则不符合ModelMapper的默认映射逻辑**,而TransactionType刚好匹配:
- ModelMapper默认会尝试将枚举类型转换为字符串,通常是调用枚举的
toString()方法,或者取枚举的name()值(即枚举常量的标识符)。 - 如果
TransactionType的toString()或name()返回的就是"CASH"这类目标字符串,就能成功映射;但TransactionStatus的对应输出可能不符合预期(比如返回了带包名的全限定名、自定义的toString内容和目标字段不匹配,或者枚举常量本身的命名和期望的字符串不一致)。 - 另外也有可能是
Transaction对象中的status字段本身就是null,但如果确认原对象有值,那可以排除这个情况。
解决方案
1. 检查并修正枚举的字符串输出
确保TransactionStatus的toString()或name()返回目标需要的字符串:
// 示例:给枚举添加自定义toString方法 public enum TransactionStatus { SUCCESS("SUCCESS"), FAILED("FAILED"); private final String value; TransactionStatus(String value) { this.value = value; } @Override public String toString() { return value; } }
2. 添加自定义类型转换器
如果不想修改枚举源码,可以给ModelMapper配置自定义转换规则:
ModelMapper modelMapper = new ModelMapper(); // 配置TransactionStatus到String的转换器 Converter<TransactionStatus, String> statusConverter = context -> { if (context.getSource() == null) { return null; } // 根据需求返回对应字符串,比如取枚举的name()或自定义值 return context.getSource().name(); }; modelMapper.addConverter(statusConverter); // 执行映射操作 Type listType = new TypeToken<List<TransactionDetails>>(){}.getType(); List<TransactionDetails> transactionDetailsList = modelMapper.map(transaction, listType);
3. 验证原对象字段值
确认Transaction列表中的每个对象的status字段都不为null,如果原字段本身就是null,映射结果自然也是null。
内容的提问来源于stack exchange,提问作者vivek hegde
相关产品推荐
相关产品推荐

