簡體   English   中英

構造函數注入連同 JDA 和 Spring 啟動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM