忽略源中的 Null 检查,同时使用多个源参数映射方法
Posted
技术标签:
【中文标题】忽略源中的 Null 检查,同时使用多个源参数映射方法【英文标题】:Ignore Null check at source , while Mapping methods with several source parameters 【发布时间】:2022-01-04 11:14:20 【问题描述】:团队,我有一个与 map struct 相关的用例。 PFB我的界面
@Mappings(
@Mapping(source = "source1.name", target = "name"),
@Mapping(source = "source2.address", target = "address"),
@Mapping(source = "source3.company", target = "company")
)
public SomeClass map(Source1 source1,Source2 source2,Source3 source3);
一切正常。但我的问题在于下面的 sn-p(它是由 mapstruct 基于上述定义的接口生成的)
public SomeClass map(Source1 source1,Source2 source2,Source3 source3)(
if ( source1== null && source2== null && source3== null )
return null;
这里我的问题是,如果 source2 和 source3 为 null,我不想返回 null,而是我将从 source1 映射可用的详细信息并继续。我已经浏览了 mapstruct 文档,但不幸的是我找不到任何可能的解决方案。 对于上述用例,我们是否在 mapstruct 中有任何解决方案,或者我们是否需要编写自定义逻辑来处理上述情况。 非常感谢这里的任何指针,并提前感谢。
【问题讨论】:
现在我已经根据源参数将此逻辑解耦为单独的方法,并使用@MappingTarget 属性将所有值映射到单个对象。但我只是想交叉检查我们是否有更好的解决方案来解决这个用例,除此之外。 我完全不明白您在寻找什么。如果source1
不为空,则 MapStruct 将使用它来进行映射。也许您可以提供一个示例说明您希望 MapStruct 做什么
@Filip ,非常感谢您花时间检查我的查询。基本上,我正在尝试从 3 个不同的源对象(或参数。如果您查看我的示例,它的 Source1 source1、Source2 source2、Source3 source3)映射目标对象。我的问题是,在实现类中,如果参数之一(source1 或 source 2 或 source 3 为 null),那么它将跳过映射并将值返回为 null(从生成的类中提取 ---if(source1= = null && source2== null && source3== null ) return null; )
我正在寻找的选项是,只有当所有参数都为空时,它才应该跳过映射。如果第一个参数为空,那么它应该继续使用参数 2 进行其余的映射(当然,如果参数 2 不为空)
只有当所有源参数都为空时,生成的代码才会返回空。如果其中任何一个不为 null,则生成的条件不匹配,它将继续映射(不返回 null)。我建议你编辑你的问题并写下你期望的情况是什么样的
【参考方案1】:
我的问题是,如果 source2 和 source3 为 null,我不想返回 null,而是我将从 source1 映射可用的详细信息并继续。
查看 MapStruct 生成的 sn-p 生成的确切内容。
public SomeClass map(Source1 source1, Source2 source2, Source3 source3)(
if ( source1 == null && source2 == null && source3 == null )
return null;
// rest of mmapping
这意味着如果source1
不是null
而source2
和source3
是null
那么映射将不会返回null
,但它会使用source1
进行映射
【讨论】:
感谢@filip 花时间检查并回答这个问题。我应该更清楚地说明我的问题。但是如果 source1 为 null 但 source2 和 source3 不为 null,这将导致 null 对吗? 不,这是不对的。 source1、source2、source3同时为null时,结果为null以上是关于忽略源中的 Null 检查,同时使用多个源参数映射方法的主要内容,如果未能解决你的问题,请参考以下文章
Automapper 忽略 null 值,但将空字符串映射到 null
在graphql中,组合多个源中的字段共享一个共同值的多个源的最佳方法是啥?
是否可以在网络共享的 NuGet 本地源中同时托管常规包和符号包?