5

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

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

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

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

    // ...
}

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

更一般地说,在这些情况下,应用程序框架保证字段在使用时已初始化且非空——但检查器框架无法知道这一点。

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

有没有办法告诉 Checker Framework 一个字段被注入,因此被正确初始化和非空,而不是简单地抑制这些错误?

4

1 回答 1

4

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

@SuppressWarnings("initialization.fields.uninitialized")您可以通过在类上写入来抑制所有字段的错误。

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

于 2015-11-10T12:55:30.167 回答