Home > Software engineering >  Spring Boot Defining A Bean
Spring Boot Defining A Bean

Time:04-25

I have this funny error, I say it is funny because my project was working and it just crashed.

I believe I have implemented everything I was supposed to implement to achieve the multi data source.

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'quoteController' defined in file [C:\Users\S4\Desktop\S4Projects\wirk-devserv-intranet\source\back-end\target\classes\com\api\controllers\QuoteController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'quoteServiceImpl' defined in file [C:\Users\S4\Desktop\S4Projects\wirk-devserv-intranet\source\back-end\target\classes\com\api\services\implementation\QuoteServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.api.repository.customer.CustomerRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Description:

Parameter 1 of constructor in com.api.services.implementation.QuoteServiceImpl required a bean of type 'com.api.repository.customer.CustomerRepository' that could not be found.

Action:

Consider defining a bean of type 'com.api.repository.customer.CustomerRepository' in your configuration.

@Autowired
private final CustomerRepository customerRepository;
@Autowired
private final QuoteRepository quoteRepository;


@Component
public interface CustomerRepository extends JpaRepository<Customer, 
 Integer> {
 }

Config File

 @EnableJpaRepositories(
    basePackageClasses = {
   QuoteRepository.class, 
     CustomerConfig.class
},
    entityManagerFactoryRef = "quoteEntityManager",
    transactionManagerRef = "quoteTransactionManager")

public class QuoteConfig {

@Bean(name = "quoteEntityManager")
@Primary
public LocalContainerEntityManagerFactoryBean quoteEntityManager(EntityManagerFactoryBuilder builder, @Qualifier("quoteDataSource") DataSource dataSource) {

    return builder
            .dataSource(dataSource)
            .packages(Quote.class)
            .persistenceUnit("S4DevservIntranet")
            .build();
}

@Primary
@Bean("quoteDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource quoteDataSource() {
    return DataSourceBuilder.create().build();
}

@Primary
@Bean("quoteTransactionManager")
public PlatformTransactionManager quoteTransactionManager(@Qualifier("quoteEntityManager") LocalContainerEntityManagerFactoryBean quoteEntityManager) {
    return new JpaTransactionManager(Objects.requireNonNull(quoteEntityManager.getObject()));
}
}

CodePudding user response:

  1. You don't need to use @Component annotation since you use the spring-data JpaRepository interface. but if you wouldn't you have to use @Repository annotation.
  2. In this part you add CustomerConfig class instead CustomerRepository in the list of JpaRepositories
 @EnableJpaRepositories(
    basePackageClasses = {
   QuoteRepository.class, 
     CustomerConfig.class
},

It must be:

@EnableJpaRepositories(
        basePackageClasses = {
       QuoteRepository.class, 
         CustomerRepository.class
    },

CodePudding user response:

Error Message tells it everything, seems you haven't created bean for CustomerRepository, so annotate the class with @Repository or @Component.

  • Related