我已经编写了很多 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 类,因为我想检查这些类以找到其他可能的错误!
这里有一些想法:
1 - setter 可能会被声明为
private
。 FindBugs 很可能不会检查 setter 是否被调用。
您可以提取一个方法并将方法级别@SuppressFBWarnings应用于该方法。
你可以添加这些字段的Setter,然后就可以去除FindBugs错误信息了
这是标记违规的代码:
读完代码有两个建议:
向字段添加
@NotNull
(这样字段就可以进入集合 writtenNonNullFields
,并且违规行为将被忽略)。
将本机方法放在 dto 类中是一个坏主意(但从源代码来看可能是这样)(
native void hi();
)。但我强烈不建议这样做。
我都尝试了,都很好用。
尝试在条件规则中使用大写字段名称,即 root.get(EntityA_.ENTITY_B)。
它通过查找错误警告解决了我的问题。 希望对您也有帮助。