powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается поднять бота на Spring Boot
25 сообщений из 233, страница 1 из 10
Не получается поднять бота на Spring Boot
    #39966855
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую! Хотел переписать своего телеграм бота, написанного на чистой Java, на новый лад с использованием Spring. Для начала решил попробовать написать простейшего бота, который просто отвечает "Hello"! Нашел подходящую библиотеку: https://github.com/rubenlagus/TelegramBots/tree/master/telegrambots-spring-boot-starter

Пошёл настраивать xml, получилось так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    <dependencies>
        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots-spring-boot-starter</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
    </dependencies>


Возможно, нахватал лишних зависимостей, так как Spring я только начинаю осваивать, подсмотрел в каком-то проекте на гитхабе.

Создаю главный класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
@SpringBootApplication
public class TelegramBotApplication {
    public static void main(String[] args) {
        ApiContextInitializer.init();
        SpringApplication.run(LibraryTelegramBot.class, args);
    }
}


И класс бота:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
@Component
public class LibraryTelegramBot extends TelegramLongPollingBot {

    private static final String TOKEN = "...";

    private static final String USERNAME = "...";

    public void onUpdateReceived(Update update) {
        if (update.hasMessage() && update.getMessage().hasText()){
            final long chat_id = update.getMessage().getChatId();
            sendTextMessage(chat_id, "Привет!");
        }
    }

    public String getBotUsername() {
        return USERNAME;
    }

    public String getBotToken() {
        return TOKEN;
    }

     private synchronized void sendTextMessage(long chat_id, String message) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(false)
                .setChatId(chat_id)
                .setText(message);
        try {
            execute(sendMessage);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}


Далее запускаю, в консоли получаю следующий лог:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
2020-06-07 13:07:43.518  INFO 3288 --- [main] bot.TelegramBotApplication: Starting TelegramBotApplication on ROMA with PID 3288 (started by РОМА in C:\Users\РОМА\IdeaProjects\gp_parser_telegrambot_spring)
2020-06-07 13:07:43.529  INFO 3288 --- [main] bot.TelegramBotApplication: No active profile set, falling back to default profiles: default
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/C:/Users/%d0%a0%d0%9e%d0%9c%d0%90/.m2/repository/com/google/inject/guice/4.2.2/guice-4.2.2.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2020-06-07 13:07:45.709  INFO 3288 --- [main] bot.TelegramBotApplication: Started TelegramBotApplication in 3.669872541 seconds (JVM running for 5.238)


После этого бот падает, приложение останавливается, никаких дополнительных ошибок или сообщений нет. Он просто перестает работать, не успев начать.
WARNING - классические для бота, написанный не на спринге бот выплевывает их таким же образом, но это не мешает ему работать.
Пробовал и с VPN - не помогло. Не знаю, куда копать.

Возможно, проблема тут: No active profile set, falling back to default profiles: default
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39966881
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какую же глупую ошибку я обнаружил спустя 3 часа.
Неверный класс указываю для
Код: java
1.
SpringApplication.run(LibraryTelegramBot.class, args);


В этом и была проблема.
Хотя мне изначально казалось, что мне необходимо передавать в аргументы тот класс, который наследуется от LongPollingBot. А нужен тот, где init().
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39966921
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот прекрасный пример бота под Хероку на этой библиотеке:
https://github.com/INFINITE-TECHNOLOGY/DAVID
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967511
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напишите хоть полезного бота. Типа там... ProbeiNomera или ProbeiTelefon. А если нету - то предложить
юзеру и внести инфу. Будет такая себе самонаполняющаяся базка.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967524
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79, я тебя умоляю. Тогда все соц-сети надо закрыть. Там же личной инфы столько скольку угрозыску не снилось.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967539
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобные базы уже создаются. По крайней мере для Андроид приложений что-то есть.

А с государством на его территории конечно я в кошки-мышки играть не буду. Это не моё.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967552
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вчера я в перерывах между анализом китайского AWS-кода и чтением спек слушал вот этого перца.

YouTube Video
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Термин - "работать на дядю" мне непонятен.

Поясни что ты понимаешь под этим.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967559
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, это такой эффемизм вопроса: "Ты капиталист или пролетарий?"
Стандартный ответом может быть: "Мелкобуржуазный пролетарий"
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967567
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стартапа точно нет.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967601
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работа.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967615
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжаю мучаться, пыхтеть и пробовать. Возникла проблема следующего рода.
В общем, если я размещаю всю логику в классе, который наследуется от LongPolling:
Код: java
1.
2.
@Component
public class GooglePlayAssistantBot extends TelegramLongPollingBot


то, мой бот прекрасно работает и по определенным запросам сохраняет информацию в базу данных. По другому запросу забирает информацию из БД и возвращает пользователю.

Стоить мне всё вынести в отдельный класс (обработку Update), и бот не может достать информацию из БД - он возвращает всегда null.

Есть репа для обращения к БД:
Код: java
1.
2.
3.
public interface GamesRepository extends CrudRepository<GooglePlayGame, Long> {
   Game findByTitle (String title);
}


Есть сам класс-сущность, которую добавляю в БД (с геттерами/сеттерами/конструкторами):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Entity
@Table(name = "GAMES")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String title;
....



В главный класс внедряю репу:
Код: java
1.
2.
@Autowired
    private GamesRepository repository;



Ну сохраняю и достаю примерно так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public void saveGame(Game game) {
    repository.save(game);
}

public Game get(String title){
    GooglePlayGame game = repository.findByTitle(title);
    return game;
}


Так всё работает. Бот отвечает на запросы и корректно добавляет/забирает в/из БД.
Пробую перенести все эти методы в другой класс:
Код: java
1.
2.
3.
4.
5.
6.
@Component
public class UpdatesReceiver {
    public void handleUpdate(Update update){
        //та же логика
    }
}


И при попытке сохранить в БД или достать из нее, я получаю NPE. Ошибки о том, что я не могу подключиться к БД, я не получаю. Таблица в БД на месте. Да и не знаю, как проверить, подключается ли он вообще к БД. При этом обычные команды работают, если не обращаться к БД.
Где я свернул не туда?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967616
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дружище. NPE происходит в конкретной строке. В стектрейсе видно. Подсвети ее в твоих сорцах.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967619
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Дружище. NPE происходит в конкретной строке. В стектрейсе видно. Подсвети ее в твоих сорцах.

Я понимаю что в конкретной (лог забыл приложить), я сисаутами заплевал консоль и все корректно, до момента обращения к репозиторию.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
2020-06-09 22:48:53.680 ERROR 7100 --- [legram Executor] Telegram Bots Api                        : BOTSESSION

java.lang.NullPointerException: null
	at ru.miroha.bot.service.UpdatesReceiver.get(UpdatesReceiver.java:65) ~[classes/:na]
	at ru.miroha.bot.service.UpdatesReceiver.handleUpdate(UpdatesReceiver.java:31) ~[classes/:na]
	at ru.miroha.bot.service.GooglePlayAssistantBot.onUpdateReceived(GooglePlayAssistantBot.java:26) ~[classes/:na]
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) ~[na:na]
	at org.telegram.telegrambots.meta.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27) ~[telegrambots-meta-4.1.2.jar:na]
	at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:305) ~[telegrambots-4.1.2.jar:na]


Т.е. при попытке достать игру из БД падает тут:
Код: java
1.
Game game = repository.findByTitle(title);


При попытке сохранить в БД падает тут:
Код: java
1.
repository.save(game);


Т.е. при заходе в два метода, которые работают с БД через репу.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967623
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое главный класс?

Вот эта штука предположительно не инициализировалась.

Код: java
1.
2.
@Autowired
    private GamesRepository repository;
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967625
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Что такое главный класс?

Вот эта штука предположительно не инициализировалась.

Код: java
1.
2.
@Autowired
    private GamesRepository repository;


Здесь у меня главный тот, который наследуется от LongPolling и получает апдейты, т.е. вот этот:
Код: java
1.
2.
@Component
public class GooglePlayAssistantBot extends TelegramLongPollingBot



Да, скорее всего репозиторий не инициализируется. Выходит спринг не может внедрить зависимость из-за того, что я через new создаю объект класса UpdatesReceiver и вызываю на нем метод.
Код: java
1.
2.
3.
4.
@Override
    public void onUpdateReceived(Update update) {
        new UpdatesReceiver().handleUpdate(update);
}
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967627
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложно понять по этим огрызкам что из себя представляет твоё приложение.

Попробуй так

Код: java
1.
2.
3.
4.
    @Autowired
    public GamesRepository repository() {
          return new GamesRepository();
    }



Или так

Код: java
1.
GamesRepository repository = context.getBean(GamesRepository.class);
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967632
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Получилось так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Component
public class GooglePlayAssistantBot extends TelegramLongPollingBot {

 
    @Autowired
    private UpdatesReceiver updatesReceiver;

    @Override
    public void onUpdateReceived(Update update) {
        updatesReceiver.handleUpdate(update);
    }


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Component
public class UpdatesReceiver {

    @Autowired
    private GamesRepository repository;

    public void handleUpdate(Update update){
        //та же логика
}



Я создавал UpdatesReceiver, которому переадресую Update и, в котором обращаюсь далее к репе, через new.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39967818
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
репозиторий нужно пометить анотацией репозиторий
@Repository
тогда @Autowired будет работать


Можно и не помечать.
Можно в конфигурационном классе указать где лежать интерфейсы репозитория.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@EnableJpaRepositories(
        basePackages = {"com.foo.repository"},
        entityManagerFactoryRef = "entityManagerFactoryBean",
        transactionManagerRef = "JpaTransactionManager"

)
@Configuration
public class MyCoolConfig {
}



:-)
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39968035
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zzz79
mad_nazgul
пропущено...


Можно и не помечать.
Можно в конфигурационном классе указать где лежать интерфейсы репозитория.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@EnableJpaRepositories(
        basePackages = {"com.foo.repository"},
        entityManagerFactoryRef = "entityManagerFactoryBean",
        transactionManagerRef = "JpaTransactionManager"

)
@Configuration
public class MyCoolConfig {
}



:-)


я думаю для проекта автора это будет overhead ,достаточно простой анотации чтобы инициализация прошла успешно

Вполне, но узнать что-то новое и попробовать это, всегда полезно :)

Возник вопрос про контроллер. Как я могу его "красиво" использовать без веб составляющей? У меня нет url и соответсвующих маппингов, типа такого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Controller
public class Controller {
@GetMapping("/main")
    public String main(Model model){
        Iterable<Message> messages = messageRepository.findAll();
        model.addAttribute("messages", messages);
        return "main";
    }
}


Я глубоко ещё не копал про контроллер и маппинги, но тут условно при запросе url с /main на конце я попаду в этот метод и верну соответсвующую модель.

А если рассмотреть мой проект, у меня есть условно этот UpdatesReceiver. Могу я к нему добавить маппинги, но чтобы маппинг связывался с сообщением пользователя?
Т.е. примерно так:
Код: java
1.
2.
3.
4.
5.
6.
7.
@GetMapping("привет")
public String main(Model model){
   return hello();
}
public void hello(){
   System.out.println("Привет!")
}
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39968040
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Странного" захотелось?

Что такое "сообщение " в твоём проекте? JMS?
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39968045
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
Обычное пользовательское сообщение в чат, которое приходит от телеграм бота.
Просто репозиторий есть, модель есть, а контроллера нет, вот я и подумал, что и его тоже как-нибудь надо реализовать.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39968071
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha
mayton,
Обычное пользовательское сообщение в чат, которое приходит от телеграм бота.
Просто репозиторий есть, модель есть, а контроллера нет, вот я и подумал, что и его тоже как-нибудь надо реализовать.

Смотри. Я могу просто подсказать тебе фреймворк который в декларативном
стиле (тыже хочешь декларативности) роутит сообщения. Любого типа. И не обязательно примитивы.

Фреймворк называется Apache Camel https://camel.apache.org/docs/
Это - вершина MQ-процессинга. Если тебе нужно построить свой Crew Dragon на месседжах
то бери его не прогадаешь.

В нем есть примерно 2 approaches для достижения такой конфигурации. Один с использованием XML routes.
Другой с динамическими роутами которые можно как-то на Java кодить. Мы использовали только первый
вариант. Вот конфигурация для твоего случая. У тебя "Привет" должен быть свойством объекта-месседжа.

https://camel.apache.org/components/latest/eips/message-router.html

Но это все красиво летает реально при очень большом проекте с сложной бизнес-логикой
и я не уверен что здесь телеграмный бот подходит.
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39968082
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
Я вот еще вариант нашел, как раз того, чего я примерно хотел.
https://habr.com/ru/post/335490/

Только сложновато для меня, а тупо копипастить не хочу.
Наверное, проще убрать вообще контроллер и сделать обычную обработку в обычном java коде без привязки к MVC архитектуре.
Но сущность (model) оставлю, как и репозиторий. Вот такой вот обрубок MV без C получится. :)
...
Рейтинг: 0 / 0
Не получается поднять бота на Spring Boot
    #39968110
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот есть 2 задачи. Первое - это сделать бота. И второе - сделать бота "странным образом".

Я-бы на твоем месте просто делал бота. В этом есть какая-то философская идея а также
следование принципам KISS/YAGNI.

Согласен?
...
Рейтинг: 0 / 0
25 сообщений из 233, страница 1 из 10
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается поднять бота на Spring Boot
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]