[英]Constructor Injection together with JDA and Spring Boot
我正在努力初始化 JDA,因為“addEventListeners”需要我輸入 EventListeners。但是,我的 EventListeners 有“注入的構造函數”(如果這是正確的詞)正在抓住我的 Dao。
我很樂意在我的 EventListeners 中使用 @Autowire,但它一直給我一個 NullPointer。
我認為問題在於 JDA 擴展了他們的 EventListener,它基本上在 Spring 引導之外加載,即使我在偵聽器上添加了 @Service 注釋。
您可以在下面看到我的問題:.addEventListeners(new JDAEventListener())
顯然,我無法執行new JDAEventListener()
,因為它需要 WixSubscriptionDao。 但是,我無法理解如何在沒有 WixSubscriptionDao 的情況下啟動 JDAEventListener,因為我需要 Dao 來進行進一步的數據處理。
public static void main(String[] args) throws InterruptedException, LoginException {
JDA jda = JDABuilder.createDefault("XXXXXXXXXXXXXXXXXXXXXX")
.enableIntents(GatewayIntent.GUILD_MESSAGES, GatewayIntent.GUILD_MEMBERS)
.setChunkingFilter(ChunkingFilter.ALL)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.addEventListeners(new JDAEventListener())
.build();
DISCORD_CONSTANT.jda = jda.awaitReady();
setupDefault();
}
@Service
public class JDAEventListener implements EventListener {
private final WixSubscriptionDao wixSubscriptionDao;
public JDAEventListener(WixSubscriptionDao wixSubscriptionDao) {
this.wixSubscriptionDao = wixSubscriptionDao;
}
@Override
public void onEvent(@NotNull GenericEvent genericEvent) {
if (genericEvent instanceof ReadyEvent) {
System.out.println("ReadyEvent done");
ArrayList<WixSubscription> wixSubscriptions = wixSubscriptionDao.findAll();
System.out.println(wixSubscriptions.size());
}
}
我很想這樣做,但如上所述,@Autowired Dao 給了我一個 NullPointer,即使它是在 SpringConfig 中定義的。 (使用構造方法時,DAO 可以完美運行)
@Service
public class JDAEventListener implements EventListener {
@Autowired
private WixSubscriptionDao wixSubscriptionDao;
public JDAEventListener() {
}
@Override
public void onEvent(@NotNull GenericEvent genericEvent) {
if (genericEvent instanceof ReadyEvent) {
System.out.println("ReadyEvent done");
ArrayList<WixSubscription> wixSubscriptions = wixSubscriptionDao.findAll();
System.out.println(wixSubscriptions.size());
}
}
我建議您創建帶有@Component
注釋的 class ,它實現了CommandLineRunner
接口。 這意味着, run
方法將在應用程序啟動時執行。 此外,您可以將其他 Spring bean 注入其中,例如JDAEventListener
bean。
@Component
public class JDAInitializer implements CommandLineRunner {
private final JDAEventListener jdaEventListener;
// Constructor injection
public JDAInitializer(JDAEventListener jdaEventListener) {
this.jdaEventListener = jdaEventListener;
}
@Override
public void run(String... args) throws Exception {
JDA jda = JDABuilder.createDefault("XXXXXXXXXXXXXXXXXXXXXX")
.enableIntents(GatewayIntent.GUILD_MESSAGES, GatewayIntent.GUILD_MEMBERS)
.setChunkingFilter(ChunkingFilter.ALL)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.addEventListeners(jdaEventListener)
.build();
DISCORD_CONSTANT.jda = jda.awaitReady();
setupDefault();
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.