这个FindBugs nullpointer取消引用错误对spring数据规范类有效吗



我在下面的行中得到"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类。它的一些片段:

@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检查将降低代码的可读性,而当前读取的代码就像使用方法链接的查询一样。

这是有效的FindBugs错误吗?

是的。

如何修复它?

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

如何避免对where和的每次调用进行null检查?因此,null检查将降低代码的可读性,而当前读取的代码就像使用方法链接的查询一样。

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

  • 添加丑陋的null检查,或者
  • Specification编写自己的替换1,其中参数和结果不是Nullable,或者
  • 单独地抑制由FindBugs发现的任何潜在的错误;知道";不是真正的bug,或者
  • 完全关掉那张支票

请注意,如果您取消Findbugs检查,这是一个实际的bug,那么您很可能在运行时得到NPE。因此,您有责任使用其他技术来发现应用程序中可能导致NPE的任何(真实(错误。例如,更全面的单元和系统测试。


1-我不确定这在技术上是否可行,但您可能能够编写Specification和friends的子类,然后更改代码以使用它们而不是原始代码。这样做会有负面影响

Spring已经从Specification类中删除了这些不正确的@Nullable注释,作为DATAJPA-1766的一部分。

在使用修复了上述缺陷的Spring版本后,这将很好地工作。

最新更新