【问题标题】:Throw NPE if the source value is null in MapStruct如果 MapStruct 中的源值为 null,则抛出 NPE
【发布时间】:2021-09-13 02:08:37
【问题描述】:

MapStruct 默认将 NullValueMappingStrategy 设置为 RETURN_NULL。我的要求是当 source 为 null 时,我需要抛出一个 NPE,类似于 lombok 的 @NonNull 的工作方式。

但我想目前 MapStruct 不支持此功能。所以我使用@BeforeMapping 来调用一个默认方法,在该方法中我检查null 并抛出NPE。

@BeforeMapping
default void checkForNullArguments(Object anySource) {
    if(anySource == null){
        throw new NullPointerException("Source is null");
    }
}

所以mapstruct实现是通过以下方式生成的:

public Bar mapToBar(Foo foo) {
    this.checkForNullArguments(foo);
    if (foo == null) {
        return null;
    } else{
        ..... //Actual mapping logic
    }
}

通过上述实现,如果源为空,则会引发 NPE,但会导致 findbugs RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE 错误,这基本上表示存在冗余空检查。 并且没有选项可以告诉 mapstruct 忽略空检查,即 NullValueCheckStrategy 只有 ALWAYS & ON_IMPLICIT_CONVERSION(默认值)但没有 IGNORE。

对源进行 null 检查并抛出 NPE 的最佳方法是什么?

PS: 有没有什么办法可以结合 MapStruct 使用 lombok 的 @NonNull ?我尝试将它添加到 mapstruct 接口中的方法,但这些都被忽略了。

【问题讨论】:

    标签: findbugs mapstruct


    【解决方案1】:

    目前有一个开放的feature request 用于支持 JSR 330 NonNull 注释。

    目前你将不得不忽略那些多余的检查警告

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多