I have 3 classes to inject custom configuration for Camunda as follows. I needed such a configuration because there are other custom DataSources in the environment. The problem is that while configuring the LocalContainerEntityManagerFactoryBean
I had to configure some values regarding the persistence unit. Finally, in order to configure this bean somehow, I tried my changes by setting packages to scan as org.camunda
. While this works in my local settings, I get an exception as follows. Note that there is an empty processes.xml file in resources/META-INF folder:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'camundaEmfBean' defined in class path resource [eu/nimble/service/bp/config/camunda/CamundaDatasourceConfig.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
at eu.nimble.service.bp.BusinessProcessApplication.main(BusinessProcessApplication.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)
Caused by: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:605)
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:445)
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:426)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:325)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
... 24 common frames omitted
Caused by: java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist
at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:187)
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:602)
... 31 common frames omitted
Configuration classes:
@Component
public class CamundaDatasourceConfig {
@Autowired
private DataSourceFactory dataSourceFactory;
@Bean
@Primary
public DataSource getDataSource() {
return dataSourceFactory.createDatasource("camunda");
}
@Bean(name = "camundaEmfBean")
@Primary
public LocalContainerEntityManagerFactoryBean camundaEntityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan("org.camunda");
return entityManagerFactoryBean;
}
@Bean(name = "camundaTm")
public PlatformTransactionManager transactionManager(@Qualifier("camundaEmfBean") LocalContainerEntityManagerFactoryBean entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory.getObject());
return transactionManager;
}
}
public class CamundaDatasourceConfigurationImpl extends AbstractCamundaConfiguration implements CamundaDatasourceConfiguration {
@Autowired
private DataSource dataSource;
@Autowired
@Qualifier("camundaTm")
private PlatformTransactionManager platformTransactionManager;
@Override
public void preInit(SpringProcessEngineConfiguration configuration) {
final DatabaseProperty database = camundaBpmProperties.getDatabase();
configuration.setTransactionManager(platformTransactionManager);
configuration.setDataSource(dataSource);
configuration.setDatabaseType(database.getType());
configuration.setDatabaseSchemaUpdate(database.getSchemaUpdate());
if (!StringUtils.isEmpty(database.getTablePrefix())) {
configuration.setDatabaseTablePrefix(database.getTablePrefix());
}
}
}
@Configuration
public class CamundaConfig {
@Bean
public static CamundaDatasourceConfiguration camundaDatasourceConfiguration() {
return new CamundaDatasourceConfigurationImpl();
}
}
So, how should I set the LocalContainerEntityManagerFactoryBean
properly? Thanks in advance.