Рассмотрите возможность определения компонента типа «Интерфейс Dao» в вашей конфигурации

#java #spring #spring-boot #spring-data-jpa #spring-data

Вопрос:

Я планирую разбить весь код слоя DAO на отдельный проект данных Spring boot. Поэтому я создал два проекта, в одном из которых будет весь код, связанный с базой данных, а в другом будет код службы, который затем будет использовать первый проект в качестве зависимости для взаимодействия для любых действий, связанных с базой данных.

Проект 1: DatabaseInteractionService Проект 2: InsuranceCleanupService

Класс запуска InsuranceCleanupService

 package com.ics;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
@EntityScan(basePackages = {"com.ms.base.entity", "com.dis", "com.dis.config", "com.dis.dao", "com.dis.dao.Impl" })

public class InsuranceCleanupServiceApplication {

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

}
 

Класс запуска DatabaseInteractionService

 package com.dis;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@SpringBootApplication
@EntityScan("com.ms.base.entity")
public class DatabaseInteractionServiceApplication {

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


    @Value("spring.datasource.driverClassName")
    String driverClassName;
    
    @Value("spring.datasource.url")
    String url;
    
    
    @Value("spring.datasource.username")
    String username;
    
    @Value("spring.datasource.password")
    String password;
    
    @Bean
    public DataSource dataSource()
    {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate()
    {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;
    }
}
 

Я использую базу данных Mysql и Spring-данные. При самостоятельной работе, кажется, нет никаких проблем.
После расставания я столкнулся с нижеприведенной проблемой.

Рассмотрите возможность определения компонента типа «com.dis.dao.EmployeeDao» в вашей конфигурации.

Ответ №1:

Почему у вас есть 2 @SpringBootApplication класса, так как один проект будет использоваться в качестве зависимости? Мне кажется, что DatabaseInteractionServiceApplication это скорее @Configuration класс, чем @SpringBootApplication класс А.

Кроме того, ошибка

Рассмотрите возможность определения компонента типа «com.dis.dao.EmployeeDao» в вашей конфигурации

означает, что где-то вы вводите (@Autowire) EmployeeDao компонент, но он не существует в вашем контексте Spring. Я полагаю, что он существует в InsuranceCleanupServiceApplication проекте, так как там вы сделали аннотации:

 @EntityScan(basePackages = {"com.ms.base.entity", "com.dis", "com.dis.config", "com.dis.dao", "com.dis.dao.Impl" })
 

@EntityScan аннотация работает только для @Entity аннотированных классов. Если вы хотите сканировать службы/репозитории/компоненты, вам следует изменить его на @ComponentScan . Вам нужно добавить @ComponentScan , так как ваш @SpringBootApplication класс принадлежит к другому пакету , com.ics com.dis и поэтому он не будет автоматически подбирать классы, которые аннотированы @Service @Component или @Repository принадлежат com.dis пакету. Так что, я полагаю, просто

 @ComponentScan(basePackages = {"com.dis"})
 

будет достаточно, так как он также будет сканировать подпакеты, например «com.dis.config», «com.dis.dao», «com.dis.dao.Impl»

Оставьте @EntityScan только для вашего пакета сущностей (он уже существует в DatabaseInteractionServiceApplication ):

 @EntityScan("com.ms.base.entity")