如何连接 Spring Bean 和 Telegram Bot common java class?

How to wire Spring Bean and Telegram Bot common java class?

我有一个标准的 TelegramBot 实现,例如:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
     ...
     TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class);
     telegramBotsApi.registerBot(new Bot());
     ...

和机器人 class:

public class Bot extends TelegramLongPollingBot {

    @Override
    public void onUpdateReceived(Update update) {
        Message inMessage = getMessage(update);
        fireMessage(inMessage.getChatId(), "TEST");
    }
 ....

而且我有像

这样的 JPA 存储库
@Repository
public interface BondsRepo extends JpaRepository<Bond, Long>{
    List<Bond> findAllByUser(ArNoteUser user);
}

我在我的控制器中使用没有任何问题:

@RestController
@RequestMapping("/investing")
public class InvestController {
    private final BondsRepo bondsRepo;  
    public InvestController(BondsRepo bondsRepo) {
        this.bondsRepo = bondsRepo;
    }
...

但是当我在 Bot class 中使用那个 repo 时,我自然会得到 NPE,因为 Bot.class 是一个常见的 Java class,但是 BondsRepo 是 Spring Bean 并且它在 Spring 上下文之外不可访问。

在我的 Bot class 中使用 JPA Repo 访问数据的正确方法是什么?

我认为您应该通过构造函数将存储库注入 Bot.class。

为此,您可以在主程序中从 SpringContext 检索一个 bean:

...
ConfigurableApplicationContext appContext = SpringApplication.run(Application.class, args);
BondsRepo repo = appContext.getBean(BondsRepo.class);
Bot bot = new Bot(repo);
...
telegramBotsApi.registerBot(bot);
...