I am moving an existing Spring boot application from Multitenancy to Database per tenant model. Some common Entities are in the Master database, whereas others will be in their respective database. These classes have been implemented and worked fine. Source to get ma started is this: https://callistaenterprise.se/blogg/teknik/2020/10/03/multi-tenancy-with-spring-boot-part3/
Classes
MasterPersistenceConfig.java (MasterDatabaseRepository below are the JPA repositories that are gonna be in the master database)
TenantPersistenceConfig.java
DynamicDataSourceBasedMultiTenantConnectionProvider.java
CurrentTenantIdentifierResolverImpl.java
application.yml
MasterPersistenceConfig.java (MasterDatabaseRepository below are the JPA repositories that are gonna be in the master database)
#Log4j2
#Configuration
#EnableJpaRepositories(
basePackages = { "${multitenancy.base-package}" },
entityManagerFactoryRef = "masterEntityManagerFactory",
transactionManagerRef = "masterTransactionManager",
includeFilters = {
#ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MasterDatabaseRepository.class)
}
)
#EnableConfigurationProperties({DataSourceProperties.class, JpaProperties.class})
public class MasterPersistenceConfig {
private final ConfigurableListableBeanFactory beanFactory;
private final JpaProperties jpaProperties;
private final String entityPackages;
#Autowired
public MasterPersistenceConfig(ConfigurableListableBeanFactory beanFactory,
JpaProperties jpaProperties,
#Value("${multitenancy.master.entityManager.packages}")
String entityPackages) {
this.beanFactory = beanFactory;
this.jpaProperties = jpaProperties;
this.entityPackages = entityPackages;
}
#Bean
public LocalContainerEntityManagerFactoryBean masterEntityManagerFactory(
#Qualifier("masterDataSource") DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitName("master-persistence-unit");
em.setPackagesToScan(entityPackages);
em.setDataSource(dataSource);
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>(this.jpaProperties.getProperties());
properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties.put(AvailableSettings.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
properties.put(AvailableSettings.BEAN_CONTAINER, new SpringBeanContainer(this.beanFactory));
em.setJpaPropertyMap(properties);
return em;
}
#Bean
public JpaTransactionManager masterTransactionManager(
#Qualifier("masterEntityManagerFactory") EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
TenantPersistenceConfig.java (Using bean of DynamicDataSourceBasedMultiTenantConnectionProvider and CurrentTenantIdentifierResolverImpl to create entityManagerFactory)
#Log4j2
#Configuration
#EnableJpaRepositories(
basePackages = {"${multitenancy.base-package}"},
entityManagerFactoryRef = "tenantEntityManagerFactory",
transactionManagerRef = "tenantTransactionManager",
includeFilters = #Filter(type = FilterType.ASSIGNABLE_TYPE, value = JpaRepository.class),
excludeFilters = #Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MasterDatabaseRepository.class)
)
#EnableConfigurationProperties(JpaProperties.class)
public class TenantPersistenceConfig {
private final ConfigurableListableBeanFactory beanFactory;
private final JpaProperties jpaProperties;
private final String entityPackages;
#Autowired
public TenantPersistenceConfig(
ConfigurableListableBeanFactory beanFactory,
JpaProperties jpaProperties,
#Value("${multitenancy.tenant.entityManager.packages}")
String entityPackages) {
this.beanFactory = beanFactory;
this.jpaProperties = jpaProperties;
this.entityPackages = entityPackages;
}
#Primary
#Bean
public LocalContainerEntityManagerFactoryBean tenantEntityManagerFactory(
#Qualifier("dynamicDataSourceBasedMultiTenantConnectionProvider") MultiTenantConnectionProvider connectionProvider,
#Qualifier("currentTenantIdentifierResolver") CurrentTenantIdentifierResolver tenantResolver) {
LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setPersistenceUnitName("tenant-persistence-unit");
emfBean.setPackagesToScan(entityPackages);
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emfBean.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>(this.jpaProperties.getProperties());
properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties.put(AvailableSettings.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
properties.put(AvailableSettings.BEAN_CONTAINER, new SpringBeanContainer(this.beanFactory));
properties.put(AvailableSettings.MULTI_TENANT, MultiTenancyStrategy.DATABASE);
properties.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, connectionProvider);
properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantResolver);
emfBean.setJpaPropertyMap(properties);
return emfBean;
}
#Primary
#Bean
public JpaTransactionManager tenantTransactionManager(
#Qualifier("tenantEntityManagerFactory") EntityManagerFactory emf) {
JpaTransactionManager tenantTransactionManager = new JpaTransactionManager();
tenantTransactionManager.setEntityManagerFactory(emf);
return tenantTransactionManager;
}
#Bean
public TenantDataSource tenantDataSource(#Qualifier("dynamicDataSourceBasedMultiTenantConnectionProvider") MultiTenantConnectionProvider connectionProvider,
#Qualifier("currentTenantIdentifierResolver") CurrentTenantIdentifierResolver tenantResolver) {
return new TenantDataSource(connectionProvider, tenantResolver);
}
#Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplateRead(#Qualifier("tenantDataSource") TenantDataSource tenantDataSource) {
return new NamedParameterJdbcTemplate(tenantDataSource);
}
#Bean
#Primary
public JdbcTemplate tenantJdbcTemplate(#Qualifier("tenantDataSource") TenantDataSource tenantDataSource) {
return new JdbcTemplate(tenantDataSource);
}
}
DynamicDataSourceBasedMultiTenantConnectionProvider (Uses TenantRepository, which MasterEntityManager manages)
#Log4j2
#Component
public class DynamicDataSourceBasedMultiTenantConnectionProvider
extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
private static final String TENANT_POOL_NAME_SUFFIX = "DataSource";
#Autowired
#Qualifier("masterDataSource")
private DataSource masterDataSource;
#Qualifier("masterDataSourceProperties")
#Autowired
private DataSourceProperties dataSourceProperties;
#Autowired
private TenantRepository masterTenantRepository;
private Map<String, HikariDataSource> tenantDataSources = new HashMap<>();
#Autowired
private DbProperties properties;
public DynamicDataSourceBasedMultiTenantConnectionProvider() {
}
public HikariDataSource getDataSource(String code) {
// masterTenantRepository usages
}
#PostConstruct
public Map<String, DataSource> getAll() {
// masterTenantRepository usages
}
#Override
protected HikariDataSource selectAnyDataSource() {
return (HikariDataSource) masterDataSource;
}
#Override
protected HikariDataSource selectDataSource(String tenantIdentifier) {
return getDataSource(tenantIdentifier);
}
private HikariDataSource createAndConfigureDataSource(Tenant tenant) {
// Datasource build and return
}
#Override
public Connection getAnyConnection() throws SQLException {
// get connection using datasource
}
#Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
// get connection using datasource
}
}
CurrentTenantIdentifierResolverImpl (Uses TenantRepository, which MasterEntityManager manages)
#Log4j2
#Component("currentTenantIdentifierResolver")
public class CurrentTenantIdentifierResolverImpl implements CurrentTenantIdentifierResolver {
#Autowired
private TenantRepository tenantRepository;
#Override
public String resolveCurrentTenantIdentifier() {
// tenantRepository usages
}
#Override
public boolean validateExistingCurrentSessions() {
return true;
}
}
application.yml
multitenancy:
base-package: packageX
datasource-cache:
maximumSize: 100
expireAfterAccess: 1
master:
entityManager:
packages: packageX
datasource:
url: jdbc:mysql://${db-ip}:3306/master
username: root
password: password
tenant:
entityManager:
packages: packageX
datasource:
url-prefix: jdbc:mysql://${db-ip}:3306/
username: root
password: password
hikari:
maximumPoolSize: 2
minimumIdle: 0
idleTimeout: 30000
readreplica:
base-package: packageX.reports
entityManager:
packages: packageX.reports
datasource:
url-prefix: jdbc:mysql://${slave-db-ip}:3306/
username: root
password: password
hikari:
maximumPoolSize: 2
minimumIdle: 0
idleTimeout: 30000
Everything works fine until this point. Now we want to add another datasource that points to a another IP, i.e. Read replica. When I add another PersistenceConfig file such as above, the application fails to start. Below are a new class added. Stack trace is added below as well.
ReadReplicaPersistenceConfig.java
#Log4j2
#Configuration
#EnableJpaRepositories(
basePackages = {"${multitenancy.readreplica.base-package}"},
entityManagerFactoryRef = "readReplicaEntityManagerFactory",
transactionManagerRef = "readReplicaTransactionManager",
includeFilters = #Filter(type = FilterType.ASSIGNABLE_TYPE, value = ReportsRepository.class)
)
#EnableConfigurationProperties(JpaProperties.class)
public class ReadReplicaPersistenceConfig {
private final ConfigurableListableBeanFactory beanFactory;
private final JpaProperties jpaProperties;
private final String entityPackages;
#Autowired
public ReadReplicaPersistenceConfig(
ConfigurableListableBeanFactory beanFactory,
JpaProperties jpaProperties,
#Value("${multitenancy.readreplica.entityManager.packages}")
String entityPackages) {
this.beanFactory = beanFactory;
this.jpaProperties = jpaProperties;
this.entityPackages = entityPackages;
}
#Bean
public LocalContainerEntityManagerFactoryBean readReplicaEntityManagerFactory(
#Qualifier("dynamicDataSourceBasedMultiTenantConnectionProvider") MultiTenantConnectionProvider connectionProvider,
#Qualifier("currentTenantIdentifierResolver") CurrentTenantIdentifierResolver tenantResolver) {
LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setPersistenceUnitName("read-db-persistence-unit");
emfBean.setPackagesToScan(entityPackages);
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emfBean.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>(this.jpaProperties.getProperties());
properties.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties.put(AvailableSettings.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
properties.put(AvailableSettings.BEAN_CONTAINER, new SpringBeanContainer(this.beanFactory));
properties.put(AvailableSettings.MULTI_TENANT, MultiTenancyStrategy.DATABASE);
properties.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, connectionProvider);
properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantResolver);
emfBean.setJpaPropertyMap(properties);
return emfBean;
}
#Bean
public JpaTransactionManager readReplicaTransactionManager(
#Qualifier("readReplicaEntityManagerFactory") EntityManagerFactory emf) {
JpaTransactionManager readReplicaTransactionManager = new JpaTransactionManager();
readReplicaTransactionManager.setEntityManagerFactory(emf);
return readReplicaTransactionManager;
}
#Bean
public ReadReplicaDataSource readReplicaDataSource(#Qualifier("dynamicDataSourceBasedMultiTenantConnectionProvider")
MultiTenantConnectionProvider connectionProvider,
#Qualifier("currentTenantIdentifierResolver")
CurrentTenantIdentifierResolver tenantResolver) {
return new ReadReplicaDataSource(connectionProvider, tenantResolver);
}
#Bean
#Primary
public NamedParameterJdbcTemplate namedParameterJdbcTemplateRead(#Qualifier("readReplicaDataSource")
ReadReplicaDataSource readReplicaDataSource) {
return new NamedParameterJdbcTemplate(readReplicaDataSource);
}
#Bean
public JdbcTemplate readReplicaJdbcTemplate(#Qualifier("readReplicaDataSource") ReadReplicaDataSource
readReplicaDataSource) {
return new JdbcTemplate(readReplicaDataSource);
}
}
Summary of the spring.log stacktrace is . Full stacktrace can be found here: https://justpaste.it/6jwhs
[13:20:23.143] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'springAsyncConfig' of type [packageX.config.async.SpringAsyncConfig$$EnhancerBySpringCGLIB$$38910a1d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.185] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.245] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler#70516d8' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.272] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#6c13eb04' of type [org.springframework.beans.factory.config.PropertiesFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.273] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#6c13eb04' of type [java.util.Properties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.276] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#18e33fe' of type [org.springframework.data.repository.core.support.PropertiesBasedNamedQueries] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.277] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#23ba6f2c' of type [org.springframework.data.repository.core.support.RepositoryFragmentsFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.278] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#23ba6f2c' of type [org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.296] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'spring.jpa-org.springframework.boot.autoconfigure.orm.jpa.JpaProperties' of type [org.springframework.boot.autoconfigure.orm.jpa.JpaProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.297] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'tenantPersistenceConfig' of type [packageX.dbframework.hibernateconfig.TenantPersistenceConfig$$EnhancerBySpringCGLIB$$f1fe8a65] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.302] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'masterDataSourceConfiguration' of type [packageX.dbframework.datasource.MasterDataSourceConfiguration$$EnhancerBySpringCGLIB$$8117359e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.317] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'masterDataSourceProperties' of type [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.335] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'masterDataSource' of type [com.zaxxer.hikari.HikariDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.341] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker' of type [org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.349] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#72ffcc16' of type [org.springframework.beans.factory.config.PropertiesFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.349] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#72ffcc16' of type [java.util.Properties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.349] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#72313bde' of type [org.springframework.data.repository.core.support.PropertiesBasedNamedQueries] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.350] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#5f53b6b2' of type [org.springframework.data.repository.core.support.RepositoryFragmentsFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.350] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#5f53b6b2' of type [org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.353] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'masterPersistenceConfig' of type [packageX.dbframework.hibernateconfig.MasterPersistenceConfig$$EnhancerBySpringCGLIB$$540470ad] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:23.494] [restartedMain] [] [] [] [o.h.j.i.u.LogHelper:31] [INFO] - HHH000204: Processing PersistenceUnitInfo [name: master-persistence-unit]
[13:20:23.530] [restartedMain] [] [] [] [o.h.Version:44] [INFO] - HHH000412: Hibernate ORM core version 5.4.27.Final
[13:20:23.638] [restartedMain] [] [] [] [o.h.a.c.Version:56] [INFO] - HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
[13:20:23.735] [restartedMain] [] [] [] [c.z.h.HikariDataSource:110] [INFO] - masterDataSource - Starting...
[13:20:24.041] [restartedMain] [] [] [] [c.z.h.HikariDataSource:123] [INFO] - masterDataSource - Start completed.
[13:20:24.056] [restartedMain] [] [] [] [o.h.d.Dialect:175] [INFO] - HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect
[13:20:24.809] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'packageX.entityListeners.SyncJobCandidateListener' of type [packageX.entityListeners.SyncJobCandidateListener] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:24.833] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'packageX.entityListeners.SyncJobListener' of type [packageX.entityListeners.SyncJobListener] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:27.154] [restartedMain] [] [] [] [o.h.e.t.j.p.i.JtaPlatformInitiator:52] [INFO] - HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
[13:20:27.162] [restartedMain] [] [] [] [o.s.o.j.LocalContainerEntityManagerFactoryBean:437] [INFO] - Initialized JPA EntityManagerFactory for persistence unit 'master-persistence-unit'
[13:20:27.165] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'masterEntityManagerFactory' of type [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:27.168] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'masterEntityManagerFactory' of type [com.sun.proxy.$Proxy164] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:27.191] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean '(inner bean)#6ada8fd3' of type [com.sun.proxy.$Proxy166] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:27.201] [restartedMain] [] [] [] [o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350] [INFO] - Bean 'readReplicaPersistenceConfig' of type [packageX.dbframework.hibernateconfig.ReadReplicaPersistenceConfig$$EnhancerBySpringCGLIB$$759c9f91] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[13:20:27.206] [restartedMain] [] [] [] [o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:596] [WARN] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'healthEndpointGroupsBeanPostProcessor' defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaDataSourceAdvisor': Cannot resolve reference to bean 'methodSecurityMetadataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'customRelyingPartyRegistrationRepository'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customRelyingPartyRegistrationRepository': Unsatisfied dependency expressed through field 'samlRegistrationRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'samlRegistrationRepository' defined in packageX.auth.repository.SamlRegistrationRepository defined in #EnableJpaRepositories declared on TenantPersistenceConfig: Cannot create inner bean '(inner bean)#7a8d7a43' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#7a8d7a43': Cannot resolve reference to bean 'tenantEntityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantEntityManagerFactory' defined in class path resource [packageXdbframework/hibernateconfig/TenantPersistenceConfig.class]: Unsatisfied dependency expressed through method 'tenantEntityManagerFactory' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dynamicDataSourceBasedMultiTenantConnectionProvider': Unsatisfied dependency expressed through field 'masterTenantRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tenantRepository' defined in packageX.dbframework.datasource.TenantRepository defined in #EnableJpaRepositories declared on MasterPersistenceConfig: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'readReplicaEntityManagerFactory' defined in class path resource [packageXdbframework/hibernateconfig/ReadReplicaPersistenceConfig.class]: Unsatisfied dependency expressed through method 'readReplicaEntityManagerFactory' parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'currentTenantIdentifierResolver': Unsatisfied dependency expressed through field 'tenantRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'packageX.dbframework.datasource.TenantRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
But when I change readReplicaEntityManagerFactory and readReplicaTransactionManager in ReadReplicaPersistenceConfig to tenantEntityManagerFactory and tenantTransactionManager respectively, application starts. Although I have not verified the which database my application is making change to.
I'd appreciate any and all help. Thank you.
I tried using #Lazy, #DependsOn to resolve dependencies to avoid BeanCreationException, but not avail.
To answer my question, I moved TenantRepository, used in DynamicDataSourceBasedMultiTenantConnectionProvider and CurrentTenantIdentifierResolverImpl, into service and lazy loaded that service into these classes, and the application started.
Something like this:
#Service
public class TenantService{
#Autowired
private TenantRepository tenantRepository;
}
public class DynamicDataSourceBasedMultiTenantConnectionProvider {
#Autowired
#Lazy
private TenantService tenantService ;
}
public class CurrentTenantIdentifierResolverImpl {
#Autowired
#Lazy
private TenantService tenantService ;
}
I am working on Spring project. In this project I have password encoder bean.
#Configuration
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter {
public AppSecurityConfiguration() {
System.out.println("\n\n " + getClass().getName() + "\n\n\n");
}
#Autowired
private UserService userService;
#Bean
public PasswordEncoder defaultPasswordEncoder() {
System.out.println("\n\n\n bean is created!!!!! \n\n\n");
return new BCryptPasswordEncoder();
}
// other configurations
}
And the class where injection is required is this,
#Component
public class Encoders {
private static PasswordEncoder bCryptPasswordEncoder;
#Autowired
private PasswordEncoder defaultPasswordEncoder;
public Encoders() throws UnsupportedEncodingException {
System.out.println("\n\n\n " + (defaultPasswordEncoder == null) + " \n\n\n"); // this has problem, as defaultPasswordEncoder is null.
Encoders.bCryptPasswordEncoder = defaultPasswordEncoder;
}
// other methods
}
The defaultPasswordEncoder in the above class is null even though I have autowired this field.
The logs are showing that although the appSecurityConfiguration bean was made before encoder bean still the defaultPasswordEncoder bean is being created after encoder bean.
Here is the log,
2021-10-31 10:28:51.644 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'appSecurityConfiguration'
com.clone.postmanc.security.AppSecurityConfiguration$$EnhancerBySpringCGLIB$$9529a353
.
.
.
.
2021-10-31 10:28:51.695 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'encoders'
true // coming from Encoder#Encoder showing that
// defaultPasswordEncoder bean is null
2021-10-31 10:28:51.697 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'defaultPasswordEncoder'
bean is created!!!!! // coming from AppSecurityConfiguration#defaultPasswordEncoder
I have also tried depends on annotation,
#Component
#DependsOn("defaultPasswordEncoder")
public class Encoders {
// rest is same
}
Now in logs defaultPasswordEncoder bean is being created before encoders but still the injection is not happening and the PasswordEncoder defaultPasswordEncoder field is null.
Here is the log,
2021-10-31 10:28:51.644 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'appSecurityConfiguration'
com.clone.postmanc.security.AppSecurityConfiguration$$EnhancerBySpringCGLIB$$9529a353
.
.
.
2021-10-31 10:51:27.323 DEBUG 59592 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'defaultPasswordEncoder'
bean is created!!!!!
2021-10-31 10:51:27.327 DEBUG 59592 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'encoders'
true // still the field is null.
Can someone tell what is happening? And to resolve this issue?
Use constructor injection instead of property injection
public Encoders(PasswordEncoder defaultPasswordEncoder)
Then the bean will be available in constructor.
I have a class annotated with #Configuration and a bean
#Configuration
public class ExampleServiceConfig {
#Bean
#ConditionalOnProperty(value = servicefeature1.enable", havingValue = "true")
public ExampleServices exampleServices() {
return new ExampleServices();
}
I then have another service class that depends on the bean above:
#ConditionalOnBean(ExampleServices.class)
public class AnotherService{
#Autowired
public AnotherService(ExampleServices exampleServices){
this.exampleServices = exampleServices
}
}
In the spring debug logs, I see the first bean is getting created:
2020-02-28 14:08:51.841 DEBUG 18158 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'exampleServices'
But the AnotherService() is not getting created:
AnotherService:
Did not match:
- #ConditionalOnBean (types: x.x.x.ExampleServices; SearchStrategy: all) did not find any beans of type x.x.x.ExampleServices (OnBeanCondition)
Why is the AnotherService() not getting created even though the ExampleService bean was created successfully?
Also, I see the "did not match" log after the ExampleService bean got created.
I think adding #DependsOn to the mix could fix your issue. Here is another answer, somewhat similar with your problem: https://stackoverflow.com/a/50518946/6908551
#Component
#ConditionalOnBean(ExampleServices.class)
#DependsOn("exampleServices")
public class AnotherService {
#Autowired
public AnotherService(ExampleServices exampleServices) {
this.exampleServices = exampleServices
}
}
I have a bean which loads Spring Batch configuration XML in a postConstruct method:
#PostConstruct
private void starter(){
String[] springConfig = {
"SpringBatch/override/application-context.xml",
"SpringBatch/override/database.xml",
"SpringBatch/jobs/job-dataExtraction.xml",
};
ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
}
}
I am using a timer to check a DB entry and start a job. The timer is calling the below method in another class.
public static void startUnidataJob(MessageDTO<String> msgDto){
JobLauncher jobLauncher = (JobLauncher) ApplicationContextProvider.getApplicationContext().getBean("jobLauncher"); //Problem occurs here
Job job = (Job) ApplicationContextProvider.getApplicationContext().getBean("dataExtractionJob");
try {
logger.info("With in starting...........................");
JobExecution execution = jobLauncher.run(job, new JobParameters());
} catch (Exception e) {
logger.error("Job launching Exception : ", e);
}
}
}
Problem when the application is loaded then I can see from the log that the bean jobLauncher is loaded. But when ApplicationContextProvider.getApplicationContext().getBean("jobLauncher") is executed it is throwing .NoSuchBeanDefinitionException: No bean named 'jobLauncher' is defined:
2019-03-11 02:03:39,594 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jobLauncher'
2019-03-11 02:03:39,594 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'jobLauncher'
2019-03-11 02:03:39,595 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Eagerly caching bean 'jobLauncher' to allow for resolving potential circular references
2019-03-11 02:03:39,596 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'jobRepository'
2019-03-11 02:03:39,597 [main] DEBUG o.s.a.f.JdkDynamicAopProxy - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [org.springframework.batch.core.repository.support.SimpleJobRepository#61d84e08]
2019-03-11 02:03:39,604 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.core.task.SimpleAsyncTaskExecutor#3f3ddbd9'
2019-03-11 02:03:39,605 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.core.task.SimpleAsyncTaskExecutor#3f3ddbd9'
2019-03-11 02:03:39,605 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'jobLauncher'
2019-03-11 02:03:39,605 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'jobLauncher'
Here is the code of ApplicationContextProvider
#Component
public class ApplicationContextProvider implements ApplicationContextAware{
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
#Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
Following is present in application-context.xml which is loaded via ClassPathXmlApplicationContext
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor">
<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
</property>
</bean>
<!-- Must set this -->
<bean
class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry" />
</bean>
<bean id="jobRegistry"
class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
Strangely enough the application is running fine in my Local.
In server I have 2 same spring batch java application running.
Can anyone help me?
I don't see the need for ApplicationContextProvider. You can inject the job and jobLauncher in the class where you defined startUnidataJob. For example:
public class JobScheduler {
private static final Logger logger = LoggerFactory.getLogger(JobScheduler.class.getName());
private Job job;
private JobLauncher jobLauncher;
public JobScheduler(Job job, JobLauncher jobLauncher) {
this.job = job;
this.jobLauncher = jobLauncher;
}
public void startUnidataJob(MessageDTO<String> msgDto) {
try {
logger.info("With in starting...........................");
JobExecution execution = jobLauncher.run(job, new JobParameters());
} catch (Exception e) {
logger.error("Job launching Exception : ", e);
}
}
}
You can declare this component as a bean in your application context and it will get injected the job and jobLauncher. Then you use it to start the job when appropriate.
Hope this helps.
I have a problem regarding the proper setup of a H2 database in springboot + hibernate and would very much appreciate your help. I guess my problem is in the #Transaction Annotation, since the respective class throws a NullPointerException. Here is some background information:
The idea of the program (which is not yet finished) is that agents (class "AgentLogic") can calulate prices for specific tasks within a Multi-Agent System. In order to calculate the price, an agent draws parameters from a database. These parameters are needed for some Machine Learning algorithms (in class "MachineLearningSource"), which will calculate the price of the agent.
I would like to setup the configuration of the database WITHOUT using an XML File, similar to the example in http://www.baeldung.com/hibernate-4-spring
The project has the following structure:
Project Structure
UPDATED CODE AFTER INCORPORATING CHANGES FROM #StanislavL
The project is implemented in SpringBoot. Accordingly, I use the following Application class:
package org.schlago.mldb;
import...
#SpringBootApplication
public class Application {
public static void main(String[] args) {
// ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
builder.headless(false);
ConfigurableApplicationContext context = builder.run(args);
}
}
The following class contains the configuration of the database in Spring Hibernate, called DataBaseConfig:
package org.schlago.mldb.database;
import...
#Configuration
#Profile("param_db")
#EnableTransactionManagement
#ComponentScan({"org.schlago.mldb.mapping","org.schlago.mldb.machineLearning"})
public class DatabaseConfig {
#Autowired
private Environment env;
#Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.driver"));
dataSource.setUrl(env.getProperty("datasource.url"));
dataSource.setUsername(env.getProperty("datasource.username"));
dataSource.setPassword(env.getProperty("datasource.password"));
return dataSource;
}
#Bean
public LocalSessionFactoryBean sessionFactory(){
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", env.getProperty("jpa.hibernate.dialect"));
hibernateProperties.put("hibernate.show_sql", env.getProperty("jpa.hibernate.show-sql"));
hibernateProperties.put("hibernate.hbm2ddl.auto", env.getProperty("jpa.hibernate.hbm2ddl.auto"));
hibernateProperties.put("spring.jpa.hibernate.ddl-auto", env.getProperty("jpa.hibernate.ddl-auto"));
sessionFactoryBean.setHibernateProperties(hibernateProperties);
return sessionFactoryBean;
}
#Bean
#Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory);
return transactionManager;
}
#Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
This configuration uses the following environment (#Profile) in order to setup the sessionFactoryBean, called appliation.yaml:
spring.profiles: param_db
datasource:
driver: org.h2.Driver
url: jdbc:h2:tcp://localhost/~/test
username: sa
password:
jpa:
hibernate.show-sql: true
hibernate.hbm2ddl.auto: none
hibernate.dialect: org.hibernate.dialect.H2Dialect
hibernate.ddl-auto: validate
hibernate.globally_quoted_identifiers: true
entitymanager:
packagesToScan: org.schlago.mldb.mapping
Parameters shall be inserted to the database via a DAO, using a #Transactional Annotation. This DAO is called ParametersDao:
package org.schlago.mldb.mapping;
import ...
#Transactional
public class ParametersDao {
#Autowired
private SessionFactory _sessionFactory;
private Session getSession() {
return _sessionFactory.getCurrentSession();
}
public void save(Parameters parameters) { getSession().save(parameters); }
public void update(Parameters parameters) {
getSession().update(parameters);
}
public List<Parameters> getAllParameters() {
return getSession().createQuery("from Parameters").list();
}
public Parameters getParameterById(int id) {
List<Parameters> parametersList = getSession()
.createQuery("from Parameters where paramId = :theId")
.setParameter("theId", id).list();
if (parametersList.size() == 0) {
return null;
}
return parametersList.get(0);
}
}
Parameters are specified via the Paramters class:
package org.schlago.mldb.mapping;
#Entity
#Table(name = "mlparam")
public class Parameters {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private long paramId;
#Column(name = "name")
private String name;
#Column(name = "value")
private double value;
#Column(name = "timestamp")
private Date timestamp;
public Parameters(){
}
public long getParamId() {
return paramId;
}
public void setParamId(int paramId) {
this.paramId = paramId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) { this.timestamp = timestamp; }
}
I think there is an error in the way ParametersDao is setup. However, for your better understanding, here are the other classes used within this project. The following class is AgentLogic, which will calculate a price upon request in a later strange of the code. Since the code is still in an early stage, I used #PostConstruct rather than a request, in order to test if the price calulation works:
package org.schlago.mldb.logic;
import...
#Component
public class AgentLogic {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
#Autowired
private MachineLearningSource machineLearningSource;
#PostConstruct
public void init(){
int priceInCent = 50;
priceInCent = machineLearningSource.getPrice(getAgent());
LOGGER.info("Answered with offer about " + priceInCent + " Cents.");
}
// DUMMY class: Return a new agent
public static Agent getAgent(){
// Currently, an Agent is just an (empty) dummy class
Agent agent = new Agent();
return agent;
}
}
Finally, the following class is responsible for price calcuation. Since the code is still in an early stage, price calculation is set randomly, rather than implementing machinelearning algorithms. In the method getParameters(), some Parameters are inserted to the dataBase for testing purposes:
package org.schlago.mldb.machineLearning;
import org.schlago.mldb.Nodes.Agent;
import org.schlago.mldb.mapping.Parameters;
import org.schlago.mldb.mapping.ParametersDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
#Component
public class MachineLearningSource {
#Autowired
ParametersDao parametersDao;
private static final Logger LOGGER = LoggerFactory.getLogger(MachineLearningSource.class);
public int getPrice(Agent agent) {
Random r = new Random();
int thePrice = r.nextInt(99) + 1;
LOGGER.info("The price is dynamically calculated right now!");
HashMap<String, Double> parameters = getParameters();
return thePrice;
}
public HashMap<String, Double> getParameters() {
HashMap<String, Double> equationParameters = new HashMap<>();
// TEST: Since database is currently empty, parameters are inserted manually here (this will change later)
LOGGER.info("About to insert into table");
Parameters myCalcParams = new Parameters();
myCalcParams.setName("kappa");
myCalcParams.setValue(2.39583992);
myCalcParams.setTimestamp(new Date());
parametersDao.save(myCalcParams);
LOGGER.info("Successfully inserted parameters");
/*
// Get the parameters via parametersDao, work in progress!
List<Parameters> parameters = parametersDao.getAllParameters();
Parameters myParam = parametersDao.getParameterById(3748);
if (myParam == null) {
LOGGER.info("Dataset does not exist!");
}
for (Parameters param : parameters) {
equationParameters.put(param.getName(), param.getValue());
LOGGER.info("Actual parameter for price calculation: " + param.getName());
LOGGER.info("Value: " + param.getValue());
}
*/
// TEST: Return dummy equationParameters
equationParameters.put("a", 2.48238948239);
equationParameters.put("b", 8.23482489729);
return equationParameters;
}
}
UPDATED ERROR STATEMENT
Unfortuntely, I still get an error:
2017-02-03 14:41:39.005 INFO 7416 --- [ main] org.schlago.mldb.Application : Starting Application on mobile-97 with PID 7416 (C:\Users\Jan\Documents\Masterarbeit\12_MLDBtest\target\classes started by Jan in C:\Users\Jan\Documents\Masterarbeit\12_MLDBtest)
2017-02-03 14:41:39.005 INFO 7416 --- [ main] org.schlago.mldb.Application : The following profiles are active: param_db
2017-02-03 14:41:39.083 INFO 7416 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext#79ca92b9: startup date [Fri Feb 03 14:41:39 CET 2017]; root of context hierarchy
2017-02-03 14:41:40.581 INFO 7416 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'databaseConfig' of type [class org.schlago.mldb.database.DatabaseConfig$$EnhancerBySpringCGLIB$$829d3967] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-02-03 14:41:40.721 INFO 7416 --- [ main] o.s.j.d.DriverManagerDataSource : Loaded JDBC driver: org.h2.Driver
2017-02-03 14:41:41.004 INFO 7416 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2017-02-03 14:41:41.020 INFO 7416 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2017-02-03 14:41:41.129 INFO 7416 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {4.3.11.Final}
2017-02-03 14:41:41.129 INFO 7416 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
2017-02-03 14:41:41.129 INFO 7416 --- [ main] org.hibernate.cfg.Environment : HHH000021: Bytecode provider name : javassist
2017-02-03 14:41:41.394 INFO 7416 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
2017-02-03 14:41:41.521 INFO 7416 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2017-02-03 14:41:41.693 INFO 7416 --- [ main] o.h.h.i.ast.ASTQueryTranslatorFactory : HHH000397: Using ASTQueryTranslatorFactory
2017-02-03 14:41:42.363 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export
2017-02-03 14:41:42.432 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete
2017-02-03 14:41:42.510 WARN 7416 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'agentLogic': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.schlago.mldb.machineLearning.MachineLearningSource org.schlago.mldb.logic.AgentLogic.machineLearningSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
2017-02-03 14:41:42.510 INFO 7416 --- [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2017-02-03 14:41:42.510 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export
2017-02-03 14:41:42.559 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete
2017-02-03 14:41:42.559 ERROR 7416 --- [ main] o.s.boot.SpringApplication : Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'agentLogic': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.schlago.mldb.machineLearning.MachineLearningSource org.schlago.mldb.logic.AgentLogic.machineLearningSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.schlago.mldb.machineLearning.MachineLearningSource org.schlago.mldb.logic.AgentLogic.machineLearningSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations:
2017-02-03 14:41:42.575 INFO 7416 --- [ main] .b.l.ClasspathLoggingApplicationListener : Application failed to start with classpath: [file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/charsets.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/deploy.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/access-bridge-64.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/cldrdata.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/dnsns.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/jaccess.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/jfxrt.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/localedata.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/nashorn.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunec.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunjce_provider.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunmscapi.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunpkcs11.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/zipfs.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/javaws.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jce.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jfr.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jfxswt.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jsse.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/management-agent.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/plugin.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/resources.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/rt.jar, file:/C:/Users/Jan/Documents/Masterarbeit/12_MLDBtest/target/classes/, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-data-jpa/1.3.5.RELEASE/spring-boot-starter-data-jpa-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter/1.3.5.RELEASE/spring-boot-starter-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot/1.3.5.RELEASE/spring-boot-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.3.5.RELEASE/spring-boot-autoconfigure-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-logging/1.3.5.RELEASE/spring-boot-starter-logging-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7.jar, file:/C:/Users/Jan/.m2/repository/ch/qos/logback/logback-core/1.1.7/logback-core-1.1.7.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/jul-to-slf4j/1.7.21/jul-to-slf4j-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.21/log4j-over-slf4j-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-core/4.2.6.RELEASE/spring-core-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/yaml/snakeyaml/1.16/snakeyaml-1.16.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-aop/1.3.5.RELEASE/spring-boot-starter-aop-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-aop/4.2.6.RELEASE/spring-aop-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar, file:/C:/Users/Jan/.m2/repository/org/aspectj/aspectjweaver/1.8.9/aspectjweaver-1.8.9.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/1.3.5.RELEASE/spring-boot-starter-jdbc-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/apache/tomcat/tomcat-jdbc/8.0.33/tomcat-jdbc-8.0.33.jar, file:/C:/Users/Jan/.m2/repository/org/apache/tomcat/tomcat-juli/8.0.33/tomcat-juli-8.0.33.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-jdbc/4.2.6.RELEASE/spring-jdbc-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/hibernate-entitymanager/4.3.11.Final/hibernate-entitymanager-4.3.11.Final.jar, file:/C:/Users/Jan/.m2/repository/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar, file:/C:/Users/Jan/.m2/repository/org/jboss/logging/jboss-logging-annotations/1.2.0.Beta1/jboss-logging-annotations-1.2.0.Beta1.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/hibernate-core/4.3.11.Final/hibernate-core-4.3.11.Final.jar, file:/C:/Users/Jan/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar, file:/C:/Users/Jan/.m2/repository/org/jboss/jandex/1.1.0.Final/jandex-1.1.0.Final.jar, file:/C:/Users/Jan/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar, file:/C:/Users/Jan/.m2/repository/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/common/hibernate-commons-annotations/4.0.5.Final/hibernate-commons-annotations-4.0.5.Final.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.1-api/1.0.0.Final/hibernate-jpa-2.1-api-1.0.0.Final.jar, file:/C:/Users/Jan/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar, file:/C:/Users/Jan/.m2/repository/javax/transaction/javax.transaction-api/1.2/javax.transaction-api-1.2.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/data/spring-data-jpa/1.9.4.RELEASE/spring-data-jpa-1.9.4.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/data/spring-data-commons/1.11.4.RELEASE/spring-data-commons-1.11.4.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-orm/4.2.6.RELEASE/spring-orm-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-context/4.2.6.RELEASE/spring-context-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-expression/4.2.6.RELEASE/spring-expression-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-tx/4.2.6.RELEASE/spring-tx-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-beans/4.2.6.RELEASE/spring-beans-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/jcl-over-slf4j/1.7.21/jcl-over-slf4j-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-aspects/4.2.6.RELEASE/spring-aspects-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/com/sparkjava/spark-core/1.1.1/spark-core-1.1.1.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-server/9.2.16.v20160414/jetty-server-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-http/9.2.16.v20160414/jetty-http-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-util/9.2.16.v20160414/jetty-util-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-io/9.2.16.v20160414/jetty-io-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-webapp/9.2.16.v20160414/jetty-webapp-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-xml/9.2.16.v20160414/jetty-xml-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-servlet/9.2.16.v20160414/jetty-servlet-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-security/9.2.16.v20160414/jetty-security-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/net/sf/xenqtt/xenqtt/0.9.7/xenqtt-0.9.7.jar, file:/C:/Users/Jan/.m2/repository/org/json/json/20151123/json-20151123.jar, file:/C:/Users/Jan/.m2/repository/com/pi4j/pi4j-core/1.0/pi4j-core-1.0.jar, file:/C:/Users/Jan/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.54/bcprov-jdk15on-1.54.jar, file:/C:/Users/Jan/.m2/repository/org/bouncycastle/bcpkix-jdk15on/1.54/bcpkix-jdk15on-1.54.jar, file:/C:/Users/Jan/.m2/repository/com/h2database/h2/1.4.192/h2-1.4.192.jar, file:/C:/Users/Jan/.m2/repository/org/opcfoundation/ua/1.02.337.10/ua-1.02.337.10.jar, file:/C:/Users/Jan/.m2/repository/com/prosys/ua/server-client-sdk/2.2/server-client-sdk-2.2.jar, file:/C:/Program%20Files%20(x86)/JetBrains/IntelliJ%20IDEA%202016.2.5/lib/idea_rt.jar]
Try to add #Component annotation to the MachineLearningSource service class and check both dao and the service are included in the #ComponentScan
UPDATE
In the AgentLogic you manually create the machineLearningSource
MachineLearningSource machineLearningSource = new MachineLearningSource();
priceInCent = machineLearningSource.getPrice(getAgent());
Instead add
#Autowired
private MachineLearningSource machineLearningSource;
To the class to let Spring initialize this properly. Or you can autowire dao in the class and manually call
machineLearningSource.setDao(theAutowiredDao);
UPDATE2:
Now the dao is not marked to be detected as a spring bean. Add #Repository annotation to the DAO.
UPDATE3:
sessionFactoryBean.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
check which exactly packages are scanned there. Need to have all packages where your entity classes are stored.