【发布时间】:2021-07-30 09:46:50
【问题描述】:
这是我第一次使用 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()); 行上抛出 NullPointerException
我的 CDI 完全错了吗?任何帮助都非常感谢,提前谢谢你。
【问题讨论】: