проблема с Autowired

Рейтинг: -4Ответов: 1Опубликовано: 14.08.2023

я делаю проект на телеграме, всё сделал кроме этой проблемы, которую я перерыл весь гугл и ни одно решение не помог. Хотел записать данные в бд, когда пользователь жмет на /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.

Ответы

▲ 0

Добавьте вот такой класс в проект:

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class JpaConfiguration {
    
}