#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")