Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IllegalAccessError while loading ApplicationContext #224

Open
beoRich opened this issue Dec 12, 2023 · 3 comments
Open

IllegalAccessError while loading ApplicationContext #224

beoRich opened this issue Dec 12, 2023 · 3 comments
Labels
test case required A test case or the mapping that fails is required for a given issue

Comments

@beoRich
Copy link

beoRich commented Dec 12, 2023

I am trying evaluate the hypersistence-optimizer in our spring boot hibernate application.
After following installation guide and userguide and also succesfully testing out hypersistence-optimizer-public-parent I am running into a dead end with the following error:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/beontra/services/budgetforecast/common/config/TestHibernateConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalAccessError: class io.hypersistence.optimizer.hibernate.decorator.AbstractHibernate56SessionFactoryDecorator tried to access field org.hibernate.internal.FastSessionServices.eventListenerGroup_LOCK (io.hypersistence.optimizer.hibernate.decorator.AbstractHibernate56SessionFactoryDecorator and org.hibernate.internal.FastSessionServices are in unnamed module of loader 'app')
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
	at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
	at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
	at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
	at app//org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
	at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
	at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
	at app//org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at app//org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)
	at app//org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
	at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123)
	at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
	... 85 more
Caused by: java.lang.IllegalAccessError: class io.hypersistence.optimizer.hibernate.decorator.AbstractHibernate56SessionFactoryDecorator tried to access field org.hibernate.internal.FastSessionServices.eventListenerGroup_LOCK (io.hypersistence.optimizer.hibernate.decorator.AbstractHibernate56SessionFactoryDecorator and org.hibernate.internal.FastSessionServices are in unnamed module of loader 'app')
`

Hibernate Config File:

@Configuration
@Profile("test")
public class TestHibernateConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();

        setHibernateLogLevel();
        em.setDataSource(dataSource);
        em.setPackagesToScan(
<packages>
        );

        em.setJpaPropertyMap(hibernateProperties());
        em.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        em.setJpaVendorAdapter(this.jpaVendorAdapter());

        return em;
    }

    private Map<String, Object> hibernateProperties() {
        Map<String, Object> hibernateProperties = new HashMap<>();
        hibernateProperties.put("hibernate.dialect", "com.beontra.services.budgetforecast.common.config.CustomDialect");
        hibernateProperties.put("hibernate.hbm2ddl.auto", "update");
        hibernateProperties.put("hibernate.show_sql", "true");

        return hibernateProperties;
    }
}

Hypersistence Configuration:

@Configuration
@Profile("test")
public class HypersistenceConfiguration {
    @Bean
    public HypersistenceOptimizer hypersistenceOptimizer(
            EntityManagerFactory entityManagerFactory) {
        return new HypersistenceOptimizer(
                new JpaConfig(entityManagerFactory)
        );
    }
}

Gradle dependencies:
+--- org.springframework.boot:spring-boot-starter-web -> 2.5.2 ()
+--- org.springframework.boot:spring-boot-starter-data-jpa:2.6.4
| +--- org.springframework.boot:spring-boot-starter-aop:2.6.4 -> 2.5.2
| | +--- org.springframework.boot:spring-boot-starter:2.5.2 (
)
| +--- org.springframework.boot:spring-boot-starter-jdbc:2.6.4 -> 2.5.2
| | +--- org.springframework.boot:spring-boot-starter:2.5.2 ()
| | +--- com.zaxxer:HikariCP:4.0.3
| | | --- org.slf4j:slf4j-api:1.7.30 -> 1.7.31
| | --- org.springframework:spring-jdbc:5.3.8
| | +--- org.springframework:spring-beans:5.3.8 (
)
| | +--- org.springframework:spring-core:5.3.8 ()
| | --- org.springframework:spring-tx:5.3.8 (
)
| +--- jakarta.transaction:jakarta.transaction-api:1.3.3
| +--- jakarta.persistence:jakarta.persistence-api:2.2.3
| +--- org.hibernate:hibernate-core:5.6.5.Final -> 5.4.32.Final
| | +--- org.jboss.logging:jboss-logging:3.4.1.Final -> 3.4.2.Final

and

    testImplementation 'com.h2database:h2:1.4.200'
    testImplementation "io.hypersistence:hypersistence-optimizer:2.7.1-trial"

Also tried a different configuration aproach via HibernateTransactionManagerBootstrapExecutorConfiguration and run into the same issue.

Any help or hints would be appreciated!

@vladmihalcea
Copy link
Owner

@beoRich Try running your application with java --add-opens to allow Reflection access on the Hibernate classes.

@beoRich
Copy link
Author

beoRich commented Dec 12, 2023

Thanks for your quick response.

Tried multiple variation (gradle test config or VM Options)
--add-opens io.hypersistence.optimizer=org.hibernate.internal
--add-open =org.hibernate.internal

But the error still remains

@vladmihalcea
Copy link
Owner

vladmihalcea commented Dec 12, 2023

@beoRich Try to replicate it on the trial branch of this repository. It has many modules, including a Spring Boot one. If you can replicate it in this repository, then I will be able to investigate it and help you find the solution to this issue.

@vladmihalcea vladmihalcea added the test case required A test case or the mapping that fails is required for a given issue label Feb 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
test case required A test case or the mapping that fails is required for a given issue
Projects
None yet
Development

No branches or pull requests

2 participants