此 FindBugs 空指针取消引用错误是否对 spring-数据规范 class 有效?

Is this FindBugs nullpointer dereference error valid for spring-data Specification class?

我在下一行收到 "Possible null pointer dereference due to return value of called method" FindBugs 错误。

Specification spec = Specification.where(idSpec).and(nameSpec)
    .and(typeSpec).and(statusSpec);

规范是 Spring 数据 JPA class。它的一些片段:

    @Nullable
    static <T> Specification<T> where(@Nullable Specification<T> spec) {
        return spec == null ? (root, query, builder) -> null : spec;
    }

    @Nullable
    default Specification<T> and(@Nullable Specification<T> other) {
        return composed(this, other, (builder, left, rhs) -> builder.and(left, rhs));
    }

这是有效的 FindBugs 错误吗?如何解决?

如何避免对 whereand 的每次调用进行空值检查?因为这样的 null 检查会降低代码的可读性,目前代码的可读性就像使用方法链接的查询一样。

Is this valid FindBugs error?

是的。

How to fix it?

null 添加测试或告诉 FindBugs 安静。

How can I avoid null checks on each and every call of where and and? As such null checks will reduce readbility of code which currently reads just like a query using method chaining.

没有灵丹妙药。您需要执行以下操作之一:

  • 添加丑陋的空检查,或者
  • 为参数和结果不是 Nullable
  • Specification 编写自己的替换代码1
  • 单独抑制 FindBugs 发现的您“知道”不是真正错误的任何潜在错误,或者
  • 完全关闭该检查。

请注意,如果您禁止作为实际错误的 Findbugs 检查,您可能会在运行时遇到 NPE。因此,您有责任 使用其他技术 来查找应用程序中可能导致 NPE 的任何(真实)错误。例如,更全面的单元和系统测试。


1 - 我不确定这在技术上是否可行,但你 可能 能够编写 Specification 和朋友的子类,并且然后更改您的代码以使用它们而不是原始代码。这样做会有缺点...

Spring 已从 Specification class 中删除这些不正确的 @Nullable 注释作为 DATAJPA-1766.

的一部分

在使用修复了上述缺陷的 Spring 版本后,现在可以正常工作了。