MapStruct疑问:为何不允许DTO类字段少于Entity类?
MapStruct DTO字段少于Entity时报错的原因与解决办法
MapStruct本身允许DTO字段数量少于Entity,你遇到的报错并非因为字段数量差异,而是MapStruct默认会尝试映射源实体的所有属性,当它找不到某属性的目标映射位置时,就会抛出错误。
你的场景里,Provider实体包含Set<Product>类型的products属性,MapStruct生成映射代码时,会默认尝试将这个属性映射到DTO,但你的ProviderDTO没有对应属性,且你未明确告知MapStruct忽略该属性,因此触发了报错。
以下是两种解决方式:
单个属性忽略:在Mapper接口的映射方法上,通过
@Mapping注解指定忽略特定源属性:@Mapper public interface ProviderMapper { ProviderMapper INSTANCE = Mappers.getMapper(ProviderMapper.class); @Mapping(target = "products", ignore = true) ProviderDTO providerToProviderDTO(Provider provider); }全局忽略未匹配属性:如果需要忽略多个未匹配的源属性,可以在Mapper接口上配置全局策略,跳过所有源实体中无对应DTO字段的属性:
@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE) public interface ProviderMapper { ProviderMapper INSTANCE = Mappers.getMapper(ProviderMapper.class); ProviderDTO providerToProviderDTO(Provider provider); }
你之前给DTO添加List后恢复正常,是因为此时DTO有了对应products的属性,MapStruct找到了映射目标,所以不再报错。但这不是必要操作,通过上述两种配置,就能实现只映射你需要的属性,无需让DTO与Entity字段完全一致。
内容的提问来源于stack exchange,提问作者peligrosa
相关产品推荐
相关产品推荐

