Mapster映射同时含只读与可写属性的接口时只读属性赋值异常
这是Mapster的预设特性,并非Bug。
原理说明
Mapster处理接口类型的映射时,默认遵循以下逻辑:
- 当目标接口的所有属性均为只读时,Mapster会自动生成实现该接口的动态代理类,通过构造函数为所有属性赋值,因此所有属性都能正常映射。
- 当目标接口同时包含只读属性和可写属性时,Mapster默认只会对带有
set访问器的可写属性执行赋值,只读属性会被直接跳过,因此会出现只读属性为默认值的情况。这个设计的初衷是避免默认映射逻辑覆盖用户对可写属性的自定义赋值逻辑。
解决方案
方案1:针对单个映射关系配置(推荐,影响范围小)
如果只需要处理特定源类到ITarget的映射,显式配置只读属性的映射规则即可:
// 替换YourSourceType为你实际的源类类型 TypeAdapterConfig<YourSourceType, ITarget>.NewConfig() .Map(dest => dest.GetOnlyProperty, src => src.GetOnlyProperty);
如果希望自动匹配所有属性(包括只读),可以开启构造函数映射:
TypeAdapterConfig<YourSourceType, ITarget>.NewConfig() .MapToConstructor(true);
方案2:全局配置(适合项目内所有接口映射场景)
如果希望所有接口映射都自动支持混合只读/可写属性的场景,添加全局配置即可:
TypeAdapterConfig.GlobalSettings.Default // 仅针对接口类型启用构造函数映射 .If((sourceType, destType) => destType.IsInterface) .MapToConstructor(true);
配置完成后再执行source.Adapt<ITarget>(),只读属性和可写属性都会正常完成映射。
内容的提问来源于stack exchange,提问作者AunAun
相关产品推荐
相关产品推荐

