Viamos
@Viamos
Человек, который любит пиццу

Аннотация @Autowired выводит null, хотя написал правильно. Почему?

Здравствуйте! Аннотация Autowired, при запуске программы выдает null. Проект который я пишу, относится к телеграмм боту, который работает с базой данных MySQL. Я пока что новенький в сфере Spring, так что особо не понимаю почему не работает мой код. Перед тем как показать ошибку, хочу отметить что проект стал не маленьким(по моим меркам), так что если нужны будут доп материал, пишите.

Ближе к ошибке
SduBotsFamilyApplication
import kz.sdu.bot.challengeBot.component.ChallengeBotApp;
import kz.sdu.bot.eventsBot.component.EventsBotApp;
import kz.sdu.bot.helpStudentBot.component.HelpStudentBotApp;
import kz.sdu.bot.lostAndFoundBot.LostAndFoundBotApp;
import kz.sdu.bot.marketPlaceBot.component.MarketPlaceBotApp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.telegram.telegrambots.meta.TelegramBotsApi;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;


@SpringBootApplication
public class SduBotsFamilyApplication {

    public static void main(String[] args) {
        SpringApplication.run(SduBotsFamilyApplication.class, args);

        try {
            TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class);
            telegramBotsApi.registerBot(new EventsBotApp());
            telegramBotsApi.registerBot(new ChallengeBotApp());
            telegramBotsApi.registerBot(new HelpStudentBotApp());
            telegramBotsApi.registerBot(new MarketPlaceBotApp());
            telegramBotsApi.registerBot(new LostAndFoundBotApp());
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}

EventsBotApp
import kz.sdu.bot.eventsBot.component.service.EventBotService;
import kz.sdu.repository.EventRepository;
import kz.sdu.repository.TelegramAccountRepository;
import kz.sdu.repository.UserRepository;
import kz.sdu.service.EventService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.objects.Update;

//fixme Add updating event with time zone

@Slf4j
@Component
public class EventsBotApp extends TelegramLongPollingBot {

    final Logger logger = LoggerFactory.getLogger(EventBotService.class);

    @Autowired
    private EventRepository eventRepository;
    @Autowired
    private TelegramAccountRepository accountRepository;
    @Autowired
    private UserRepository userRepository;

    @Override
    public String getBotUsername() {
        return "sdu_event_bot";
    }

    @Override
    public String getBotToken() {
        return System.getenv("bots:sdu_event_bot");
    }

    @Override
    public void onUpdateReceived(Update update) {
        logger.debug("User:\n" +
                "account id: {}", update.getMessage().getChat().getId());
        EventBotService eventBotService = new EventBotService(eventRepository, accountRepository, userRepository);
        eventBotService.setIds(update.getMessage().getChat().getId(), update.getMessage().getChatId().toString());
        if (update.hasMessage()) {

            if (update.getMessage().hasText()) {
                //todo: create new class with thread
                switch (update.getMessage().getText().trim()) { //checking message on the default command
                    case "/events" -> eventBotService.showEvents();
                    case "/account" -> eventBotService.showAccount();
                    case "/information" -> {}
                    default -> eventBotService.defaultAction(update);
                }
            }
        } else if (update.hasCallbackQuery()) {
            String callbackData = update.getCallbackQuery().getData();

            if (callbackData.contains("/edit_account")) {
                eventBotService.editAccount(callbackData);
//            } else if (callbackData.contains("/liked_events_account")) {
//                eventBotService.showFavoriteEvents();
            } else if (callbackData.contains("_like_event")) {
                // При нажатии кнопки лайка или дизлайк, сообщение должен изменится
                // кнопка на противоположную сторону

                final long idEvent;

                if (callbackData.contains("account")) {
                    idEvent = Long.parseLong(
                            callbackData.substring(callbackData.indexOf("&id=") + 4));
                } else idEvent = Long.parseLong(callbackData.substring(
                        callbackData.indexOf("&id=") + 4,
                        callbackData.indexOf("&index"))); // get event id in callback

                if (callbackData.contains("save"))
                    //save like message to account
                    eventBotService.saveEvent(idEvent);
                else if (callbackData.contains("remove")) {
                    //remove like message to account
                    new EventService().removeEvent(idEvent);
                }
                eventBotService.editEventMessage(update, idEvent, callbackData);
            } else if (callbackData.contains("/events_account")) {
                eventBotService.showEvents();
            }
        }
    }
}

UserRepository
import kz.sdu.entity.User;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import javax.persistence.LockModeType;
import java.util.List;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    @Lock(LockModeType.READ)
    List<User> findAllByStudentID(String studentId);

    @Lock(LockModeType.READ)
    User findUserByStudentID(String studentId);

    @Lock(LockModeType.READ)
    User findUserByTelegramAccount_Id(Long telegramId);
}


Получается если решить проблему, думаю можно будет решить проблему с остальными репозиториями. Прошу помочь, буду очень благодарен

PS Я думал на счет конструктора, но вот при его использовании мне придется в главном классе(SpringApp) вставлять, а так как там идет аннотация @SpringBootApplication, он не дает мне возможности вставить репы
  • Вопрос задан
  • 311 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Spring
Седой и строгий
Внедрение происходит только в те компоненты, жизненным циклом которых управляет контейнер. А вы EventsBotApp создали сами оператором new.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы