Mapster中string与Email映射:null值不触发映射的问题求助
解决Mapster中string与自定义Email类型null值映射失效的通用方案
问题场景
已配置string与自定义Email类型的双向映射:
public void Register(TypeAdapterConfig config) { config.NewConfig<string, Email>() .MapWith(value => new Email(value)); config.NewConfig<Email, string>() .MapWith(email => email.Value); }
但当输入值为null时,Mapster不会触发该映射(因识别为null而非string类型)。以User类与相关DTO的映射为例:
class User { public Email Email { get; set; } } // 原有映射配置 public void Register(TypeAdapterConfig config) { config.NewConfig<UserDto, User>(); config.NewConfig<User, UserDto>(); config.NewConfig<UserForCreationDto, User>() .TwoWays(); config.NewConfig<UserForUpdateDto, User>() .TwoWays(); }
Email不为空时映射正常,为null时映射失效。虽可在每个User相关映射中手动指定字段映射解决,但需避免重复操作,寻求通用方案。
通用解决方案
方案1:增强类型映射的null值处理
修改string与Email的双向映射配置,显式处理null值并启用全局生效规则:
public void Register(TypeAdapterConfig config) { // string → Email,处理null场景 config.NewConfig<string, Email>() .MapWith(value => value == null ? null : new Email(value)) .AllowNullDestinationValues(true); // Email → string,处理null场景 config.NewConfig<Email, string>() .MapWith(email => email?.Value) .AllowNullDestinationValues(true); }
配置完成后,所有涉及string与Email类型的映射(包括User与各类DTO的映射)会自动应用该规则,无需再手动指定每个字段的映射逻辑。
方案2:注册全局类型转换器
通过全局类型转换器实现更彻底的通用转换,优先级高于普通映射配置,确保所有场景(含null值)都能触发转换:
public void Register(TypeAdapterConfig config) { // 注册string到Email的转换器 config.TypeConverterFactory.AddConverter<string, Email>(value => value == null ? null : new Email(value)); // 注册Email到string的转换器 config.TypeConverterFactory.AddConverter<Email, string>(email => email?.Value); }
验证效果
完成上述任一配置后,User与各类DTO的映射无需额外修改,无论Email字段为null还是有效值,都能正确完成双向转换:
// 示例1:UserDto.Email为null时,映射后的User.Email也为null var userDto = new UserDto { Email = null }; var user = userDto.Adapt<User>(); // 示例2:User.Email为null时,映射后的UserDto.Email也为null var user = new User { Email = null }; var userDto = user.Adapt<UserDto>();
内容的提问来源于stack exchange,提问作者Paul DeVito
相关产品推荐
相关产品推荐

