使用Checker Framework时,避免在注入的字段上出现“未初始化”错误

glt*_*lts 5 java dependency-injection checker-framework

Checker Framework的Nullness Checker遇到未初始化的字段时,将生成错误。

[ERROR] /home/glts/src/example/src/main/java/BookRepositoryImpl.java:[39,7]
error: [initialization.fields.uninitialized] the constructor does not initialize fields: em
Run Code Online (Sandbox Code Playgroud)

现在,通过依赖注入注入一些字段是一种常见的模式:

@Repository
public class BookRepositoryImpl implements BookRepository {
    @PersistenceContext 
    private EntityManager em;

    @Override
    @Nullable
    public Book findById(int id) {
        return em.find(Book.class, id);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,@javax.persistence.PersistenceContext注释确保在构建存储库em后将保留对EntityManager实例的引用。

更一般地,在这些情况下,应用程序框架保证字段被初始化并且在使用时不为空–但是Checker框架不知道这一点。

到目前为止,我发现一种解决方法是将字段注入转换为构造函数注入(@Inject)。但是,在上面的示例中,这不是选项。

有没有一种方法可以告诉Checker Framework注入了一个字段,因此正确地初始化了该字段并且该字段为非null,而没有简单地抑制这些错误?

mer*_*nst 6

  1. @SuppressWarnings("initialization.field.uninitialized")您可以通过在字段声明上写入来抑制单个字段的错误。
  2. @SuppressWarnings("initialization.field.uninitialized")您可以通过在类上写入来抑制所有字段的错误。

存在一些注入框架,可以在@PersistenceContext存在注释的情况下将 null 作为值注入,例如当 .xml 文件不存在、代码未在事务中运行等时。编写注释 @SuppressWarnings("initialization.field.uninitialized")是您表达自己的方式相信您正在使用的那个总是会为您的代码注入一个非空值。