FindBugs:使用 JPA 元模型时如何避免“Unwriting public field”警告?

问题描述 投票:0回答:5

我已经编写了很多 DAO 类,并在其中使用了

JPA criteria API
及其元模型,如本例所示:

@Override
public EntityA findByEntityB(EntityB entityB) {
  CriteriaBuilder builder = this.getCriteriaBuilder();
  CriteriaQuery<EntityA> criteriaQuery = builder.createQuery(EntityA.class);
  Root<EntityA> root = criteriaQuery.from(EntityA.class);
  criteriaQuery.select(root);
  criteriaQuery.where(builder.and(builder.equal(root.get(EntityA_.entityB), entityB)));
  return this.findByCriteriaQuery(criteriaQuery);
}

运行静态代码分析时,

FindBugs
抛出以下警告:

UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD,优先级:正常

不成文的公共或受保护字段:EntityA_.entityB

没有看到对此公共/受保护字段的写入。所有读取它都会返回默认值。检查是否有错误(应该已经初始化了吗?),如果没有用就删除它。

当我在几乎所有查询中使用元模型类时,经常会抛出此警告。

有什么有用的方法可以避免这些警告吗?众所周知,元模型类只是生成的,它们的属性从未被写入。

我不想从 FindBugs sca 中排除 DAO 类,因为我想检查这些类以找到其他可能的错误!

java jpa criteria-api findbugs
5个回答
3
投票

这里有一些想法:


1 - setter 可能会被声明为

private
。 FindBugs 很可能不会检查 setter 是否被调用。


1
投票

可能重复如何抑制字段或局部变量的 FindBugs 警告

您可以提取一个方法并将方法级别@SuppressFBWarnings应用于该方法。


0
投票

你可以添加这些字段的Setter,然后就可以去除FindBugs错误信息了


0
投票

这是标记违规的代码:

https://github.com/spotbugs/spotbugs/blob/267af9fe850a7637252a748f7ce3483fab80968c/spotbugs/src/main/java/edu/umd/cs/findbugs/detect/UnreadFields.java#L1000

读完代码有两个建议:

  1. 向字段添加

    @NotNull
    (这样字段就可以进入集合
    writtenNonNullFields
    ,并且违规行为将被忽略)。

  2. 将本机方法放在 dto 类中是一个坏主意(但从源代码来看可能是这样)(

    native void hi();
    )。但我强烈不建议这样做。

我都尝试了,都很好用。


0
投票

尝试在条件规则中使用大写字段名称,即 root.get(EntityA_.ENTITY_B)。

它通过查找错误警告解决了我的问题。 希望对您也有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.