ModelMapper::map()更新实体时id字段被customerId覆盖的异常问题
非预期赋值的原因
- ModelMapper默认采用宽松匹配策略(Loose Matching Strategy),该策略会将属性名按驼峰规则拆分为独立的名称token进行模糊匹配:只要源属性的token后缀和目标属性的token完全匹配,就会判定两个属性为映射关系。
- 你的源对象
OrderRequest的customerId属性拆分为token后为customer、id,目标对象CustomerOrder的id属性拆分为token后为id,二者后缀匹配成功,因此ModelMapper在执行更新映射时,自动将orderDto.customerId的值写入了customerOrder.id字段,触发了这个异常行为。
修复方案
你可以选择以下任意一种方案解决该问题:
方案1:启用严格匹配策略
全局配置ModelMapper使用严格匹配模式,只有属性名完全一致才会生成映射关系,从根源避免模糊匹配的歧义:
// 初始化ModelMapper时配置 ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
方案2:显式跳过目标对象的主键字段
针对OrderRequest到CustomerOrder的映射规则,显式配置跳过主键id字段的赋值:
modelMapper.typeMap(OrderRequest.class, CustomerOrder.class) .addMappings(mapper -> mapper.skip(CustomerOrder::setId));
方案3:显式声明对应字段的映射关系
明确指定customerId的映射目标,消除匹配歧义:
modelMapper.typeMap(OrderRequest.class, CustomerOrder.class) .addMapping(OrderRequest::getCustomerId, CustomerOrder::setCustomerId);
内容的提问来源于stack exchange,提问作者Dima Kovbasa
相关产品推荐
相关产品推荐

