проблема с Autowired
я делаю проект на телеграме, всё сделал кроме этой проблемы, которую я перерыл весь гугл и ни одно решение не помог. Хотел записать данные в бд, когда пользователь жмет на /start. Уже пытаюсь 3 часа решить эту проблему, да никак.. Прикладываю код классов, ошибки и pom.xml. Только я обрежу немного кусок кода, который для вас бесполезен будет. Всё что я пытался сделать: @ComponentScan в main, @Repository в UserRepository, @Autowired (required = false). Надеюсь на вашу помощь
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>stores.telegrambot</groupId>
<artifactId>Store</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Store</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
User
package store.telegrambot.user;
import java.sql.Timestamp;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity (name = "users")
public class User {
@Id
private Long chatId;
private String firstName;
private String lastName;
private String userName;
private Timestamp registeredAt;
public User () {}
public Long getChatId() {
return chatId;
}
public void setChatId(Long chatId) {
this.chatId = chatId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Timestamp getRegisteredAt() {
return registeredAt;
}
public void setRegisteredAt(Timestamp registeredAt) {
this.registeredAt = registeredAt;
}
}
Репозиторий:
package store.telegrambot.user;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Long> {
}
Приложение телеграмма бота:
@Component
public class TelegramBot extends TelegramLongPollingBot {
@Autowired
UserRepository userRepository;
private final BotConfig bot;
public TelegramBot (BotConfig bot) {
this.bot = bot;
}
@Override
public void onUpdateReceived(Update update) {
if (update.hasMessage() && update.getMessage().hasText()) {
String fromUser = update.getMessage().getText();
Long chatId = update.getMessage().getChatId();
switch (fromUser) {
case "/start":
registerUser(update.getMessage());
startCommand (chatId, update.getMessage().getChat().getFirstName());
break;
private void registerUser (Message msg) {
if (userRepository.findById(msg.getChatId()).isEmpty()) {
Long chatId = msg.getChatId();
Chat chat = msg.getChat();
User user = new User ();
user.setChatId(chatId);
user.setUserName(chat.getUserName());
user.setFirstName(chat.getFirstName());
user.setLastName(chat.getLastName());
user.setRegisteredAt(new Timestamp(System.currentTimeMillis()));
userRepository.save(user);
}
Старт спринга:
@SpringBootApplication
public class StoreApplication {
public static void main(String[] args) {
SpringApplication.run(StoreApplication.class, args);
}
}
application.properties:
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/store
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
Ошибки:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
[32m :: Spring Boot :: [39m [2m (v3.1.2)[0;39m
[2m2023-08-14T18:09:44.133+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mstores.telegrambot.StoreApplication [0;39m [2m:[0;39m Starting StoreApplication using Java 17.0.7 with PID 936 (C:\Users\qweac\eclipse-workspace\Store\target\classes started by AcerNitro5 in C:\Users\qweac\eclipse-workspace\Store)
[2m2023-08-14T18:09:44.134+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mstores.telegrambot.StoreApplication [0;39m [2m:[0;39m No active profile set, falling back to 1 default profile: "default"
[2m2023-08-14T18:09:44.360+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36m.s.d.r.c.RepositoryConfigurationDelegate[0;39m [2m:[0;39m Bootstrapping Spring Data JPA repositories in DEFAULT mode.
[2m2023-08-14T18:09:44.372+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36m.s.d.r.c.RepositoryConfigurationDelegate[0;39m [2m:[0;39m Finished Spring Data repository scanning in 7 ms. Found 0 JPA repository interfaces.
[2m2023-08-14T18:09:44.548+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.hibernate.jpa.internal.util.LogHelper [0;39m [2m:[0;39m HHH000204: Processing PersistenceUnitInfo [name: default]
[2m2023-08-14T18:09:44.579+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36morg.hibernate.Version [0;39m [2m:[0;39m HHH000412: Hibernate ORM core version 6.2.6.Final
[2m2023-08-14T18:09:44.580+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36morg.hibernate.cfg.Environment [0;39m [2m:[0;39m HHH000406: Using bytecode reflection optimizer
[2m2023-08-14T18:09:44.670+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.h.b.i.BytecodeProviderInitiator [0;39m [2m:[0;39m HHH000021: Bytecode provider name : bytebuddy
[2m2023-08-14T18:09:44.752+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.s.o.j.p.SpringPersistenceUnitInfo [0;39m [2m:[0;39m No LoadTimeWeaver setup: ignoring JPA class transformer
[2m2023-08-14T18:09:44.762+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.HikariDataSource [0;39m [2m:[0;39m HikariPool-1 - Starting...
[2m2023-08-14T18:09:44.937+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.pool.HikariPool [0;39m [2m:[0;39m HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@18a096b5
[2m2023-08-14T18:09:44.938+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.HikariDataSource [0;39m [2m:[0;39m HikariPool-1 - Start completed.
[2m2023-08-14T18:09:44.972+03:00[0;39m [33m WARN[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36morg.hibernate.orm.deprecation [0;39m [2m:[0;39m HHH90000026: MySQL8Dialect has been deprecated; use org.hibernate.dialect.MySQLDialect instead
[2m2023-08-14T18:09:45.118+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.h.b.i.BytecodeProviderInitiator [0;39m [2m:[0;39m HHH000021: Bytecode provider name : bytebuddy
[2m2023-08-14T18:09:45.256+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.h.e.t.j.p.i.JtaPlatformInitiator [0;39m [2m:[0;39m HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
[2m2023-08-14T18:09:45.260+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mj.LocalContainerEntityManagerFactoryBean[0;39m [2m:[0;39m Initialized JPA EntityManagerFactory for persistence unit 'default'
[2m2023-08-14T18:09:45.334+03:00[0;39m [33m WARN[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36ms.c.a.AnnotationConfigApplicationContext[0;39m [2m:[0;39m Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'botApp': Unsatisfied dependency expressed through field 'bot': Error creating bean with name 'telegramBot': Unsatisfied dependency expressed through field 'userRepository': No qualifying bean of type 'store.telegrambot.user.UserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
[2m2023-08-14T18:09:45.334+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mj.LocalContainerEntityManagerFactoryBean[0;39m [2m:[0;39m Closing JPA EntityManagerFactory for persistence unit 'default'
[2m2023-08-14T18:09:45.336+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.HikariDataSource [0;39m [2m:[0;39m HikariPool-1 - Shutdown initiated...
[2m2023-08-14T18:09:45.341+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mcom.zaxxer.hikari.HikariDataSource [0;39m [2m:[0;39m HikariPool-1 - Shutdown completed.
[2m2023-08-14T18:09:45.346+03:00[0;39m [32m INFO[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36m.s.b.a.l.ConditionEvaluationReportLogger[0;39m [2m:[0;39m
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
[2m2023-08-14T18:09:45.359+03:00[0;39m [31mERROR[0;39m [35m936[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.s.b.d.LoggingFailureAnalysisReporter [0;39m [2m:[0;39m
***************************
APPLICATION FAILED TO START
***************************
Description:
Field userRepository in stores.telegrambot.bot.TelegramBot required a bean of type 'store.telegrambot.user.UserRepository' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'store.telegrambot.user.UserRepository' in your configuration.
Источник: Stack Overflow на русском