如何解决访问注入的属性导致 NullPointerException
这是我第一次与 Quarkus 和 CDI 合作,我想我弄错了。
在我的应用程序中,用户可以下载一些文件。我想控制同时下载的文件数量。我想我可以通过创建一个带有 @ApplicationScoped
注释的 bean,在启动时强制实例化,然后将它注入到我需要知道当前正在下载多少文件的任何地方来做到这一点。
这是我设法做到的:
@ApplicationScoped
public class DownloadState {
private int downloadingFiles;
void startup(@Observes StartupEvent event) {
setDownloadingFiles(0);
System.out.println("downloading files: " + downloadingFiles);
}
public int getDownloadingFiles() {
return downloadingFiles;
}
public void setDownloadingFiles(int downloadingFiles) {
this.downloadingFiles = downloadingFiles;
}
public void incrementDownloadingFiles() {
downloadingFiles++;
}
public void decrementDownloadingFiles() {
downloadingFiles--;
}
}
这样做我可以在启动时看到日志说“正在下载文件:0”,所以我知道这个类已经被实例化了。
我尝试在此处访问下载文件的数量:
public class Downloader {
private static final Logger LOG = Logger.getLogger(Downloader.class);
@Inject
DownloadState downloadState;
private Dotenv dotenv = Dotenv.configure()
.directory("../")
.filename(".env.local")
.load();
private String fileName = dotenv.get("DOWNLOAD_PATH");
private String url;
public Downloader(String url,String fileName) {
this.url = url;
this.fileName += fileName;
}
public void downloadProduct() {
LOG.info("Downloading Files: " + downloadState.getDownloadingFiles());
//...
}
}
每当调用 downloadProduct 时,都会在行 LOG.info("Downloading Files: " + downloadState.getDownloadingFiles());
我的 CDI 完全错了吗?非常感谢您的帮助,在此先感谢您。
解决方法
我假设您是直接调用 Downloader
构造函数——在这种情况下,确实不会发生注入,您的 downloadState
将是 null
。依赖注入具有“传染性”——你必须在任何地方使用它。
在你的情况下,我可能只是让 Downloader
也@ApplicationScoped
,在你使用它的任何地方注入它,并可能从构造函数中移动 url
和 fileName
参数到downloadProduct
。实际上在那个时候,downloadingFiles
的数量也可以在 Downloader
中。 (另请注意,它可以从多个线程访问——所以我可能会使用 AtomicInteger
来表示 downloadingFiles
。)
总而言之,就像这样:
@ApplicationScoped
public class Downloader {
private static final Logger LOG = Logger.getLogger(Downloader.class);
private final AtomicInteger downloadingFiles = new AtomicInteger(0);
private final String downloadPath = Dotenv.configure()
.directory("../")
.filename(".env.local")
.load()
.get("DOWNLOAD_PATH");
public void downloadProduct(String url,String fileName) {
String path = downloadPath + fileName;
int current = downloadingFiles.incrementAndGet();
LOG.info("Downloading Files: " + current);
//...
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。