Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Не получается поднять бота на Spring Boot / 25 сообщений из 233, страница 1 из 10
07.06.2020, 14:11
    #39966855
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Приветствую! Хотел переписать своего телеграм бота, написанного на чистой 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
07.06.2020, 16:36
    #39966881
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Какую же глупую ошибку я обнаружил спустя 3 часа.
Неверный класс указываю для
Код: java
1.
SpringApplication.run(LibraryTelegramBot.class, args);


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

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

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

Поясни что ты понимаешь под этим.
...
Рейтинг: 0 / 0
09.06.2020, 20:02
    #39967559
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
mayton, это такой эффемизм вопроса: "Ты капиталист или пролетарий?"
Стандартный ответом может быть: "Мелкобуржуазный пролетарий"
...
Рейтинг: 0 / 0
09.06.2020, 20:26
    #39967567
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Стартапа точно нет.
...
Рейтинг: 0 / 0
09.06.2020, 21:54
    #39967601
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Работа.
...
Рейтинг: 0 / 0
09.06.2020, 22:42
    #39967615
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Продолжаю мучаться, пыхтеть и пробовать. Возникла проблема следующего рода.
В общем, если я размещаю всю логику в классе, который наследуется от 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
09.06.2020, 22:46
    #39967616
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Дружище. NPE происходит в конкретной строке. В стектрейсе видно. Подсвети ее в твоих сорцах.
...
Рейтинг: 0 / 0
09.06.2020, 22:55
    #39967619
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
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
09.06.2020, 23:02
    #39967623
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Что такое главный класс?

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

Код: java
1.
2.
@Autowired
    private GamesRepository repository;
...
Рейтинг: 0 / 0
09.06.2020, 23:10
    #39967625
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
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
09.06.2020, 23:18
    #39967627
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
Сложно понять по этим огрызкам что из себя представляет твоё приложение.

Попробуй так

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



Или так

Код: java
1.
GamesRepository repository = context.getBean(GamesRepository.class);
...
Рейтинг: 0 / 0
09.06.2020, 23:22
    #39967632
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
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
10.06.2020, 12:41
    #39967818
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
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
10.06.2020, 20:03
    #39968035
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
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
10.06.2020, 20:15
    #39968040
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
"Странного" захотелось?

Что такое "сообщение " в твоём проекте? JMS?
...
Рейтинг: 0 / 0
10.06.2020, 20:22
    #39968045
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
mayton,
Обычное пользовательское сообщение в чат, которое приходит от телеграм бота.
Просто репозиторий есть, модель есть, а контроллера нет, вот я и подумал, что и его тоже как-нибудь надо реализовать.
...
Рейтинг: 0 / 0
10.06.2020, 22:53
    #39968071
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
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
11.06.2020, 00:19
    #39968082
miroooha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается поднять бота на Spring Boot
mayton,
Я вот еще вариант нашел, как раз того, чего я примерно хотел.
https://habr.com/ru/post/335490/

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

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

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


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