Search code examples
spring-data-gemfirespring-boot-data-geode

Spring Boot Geode Unsatisfied dependency expressed through method 'sessionRegion'


The correct dependencies for my gradle.build are driving me crazy!

In order to access an Apache Geode 1.10 server, I am using:

// Geode client dependency
implementation 'org.springframework.geode:spring-geode-starter:1.2.13.RELEASE'    
implementation 'org.springframework.data:spring-data-geode:2.2.12.RELEASE' 
implementation 'org.springframework.boot:spring-boot-starter-tomcat:2.2.13.RELEASE' 

This fails with the error:

org.springframework.context.support.AbstractApplicationContext 596 refresh: 
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'ClusteredSpringSessions' defined in class path resource 
[org/springframework/session/data/gemfire/config/annotation/web/http/GemFireHttpSessionConfiguration.class]: 
Unsatisfied dependency expressed through method 'sessionRegion' parameter 0; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.springframework.data.gemfire.config.annotation.ClientCacheConfiguration': 
Initialization of bean failed; nested exception is java.lang.IllegalAccessError: 
class org.springframework.data.gemfire.config.annotation.AbstractCacheConfiguration$$Lambda$703/0x0000000801025d10 
tried to access protected method 'boolean org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport.hasValue(java.lang.Number)' 
(org.springframework.data.gemfire.config.annotation.AbstractCacheConfiguration$$Lambda$703/0x0000000801025d10 
and org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport are in unnamed module of loader 'app')

What is there to tell me the dependency missing for the UnsatisfiedDependencyException for 'ClusteredSpringSessions'?

If I remove the @EnableGemFireHttpSession annotation then I get the error

2021-02-02T19:29:49,011 WARN  [main] org.springframework.context.support.AbstractApplicationContext 596 refresh: 
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'cacheManager' defined in class path resource [org/springframework/data/gemfire/cache/config/GemfireCachingConfiguration.class]:
Unsatisfied dependency expressed through method 'cacheManager' parameter 0; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.springframework.data.gemfire.config.annotation.ClientCacheConfiguration': 
Initialization of bean failed; nested exception is java.lang.IllegalAccessError: 
class org.springframework.data.gemfire.config.annotation.AbstractCacheConfiguration$$Lambda$679/0x00000008010306b8 
tried to access protected method 'boolean org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport.hasValue(java.lang.Number)'
(org.springframework.data.gemfire.config.annotation.AbstractCacheConfiguration$$Lambda$679/0x00000008010306b8 
and org.springframework.data.gemfire.config.annotation.support.AbstractAnnotationConfigSupport are in unnamed module of loader 'app')

What is there to tell me the dependency missing for the UnsatisfiedDependencyException for 'cacheManager'?

Thanks

UPDATE The App is run like Spring Boot @ComponentScan finds candidate component class but does not inject @Configuration beans but more specifically

@SpringBootApplication
@ComponentScan({"api", "rsocket", "pricing", "listeners", "dealing", "web"}) // scans packages for @ components
@EnableLogging(logLevel="debug", logFile="geodeApi.log")
public class Api {
    
    private static final Logger log = LogManager.getLogger(Api.class);

    public static void main(String[] args) {
        log.info("In Main");
        
        SpringApplication app = new SpringApplication(Api.class);
        app.setWebApplicationType(WebApplicationType.REACTIVE);
        SpringApplication.run(Api.class, args);
        
        log.info("Out Main");
    }
}

The component scan finds various @Component annotated classes for example

@Component
@EnableClusterDefinedRegions(clientRegionShortcut=ClientRegionShortcut.PROXY)
public class ClientCache {
    
    private static final Logger log = LogManager.getLogger(ClientCache.class);
    
    @Resource
    private Region<String, String> admin;
    
    @Autowired
    LQuote lQuote;
    
    @Autowired
    LReject lReject;    
    
    @Autowired
    LDeal lDeal;
    
    @Autowired
    DealNumber dealNumber;
    
    @Autowired
    PriceService priceService;
    
    @PreDestroy
    public void onDestroy() throws Exception {
        
        log.info("onDestroy");
        
        String guid = UUID.randomUUID().toString().substring(0, 8).toUpperCase();           
        admin.put(guid, "API Shutdown");
        
        // TODO: Cancel all open quote streams
        
        log.traceExit();
    }
    
    @Bean
    ApplicationRunner StartedUp(){      
        log.traceEntry("StartedUp");
            
        return args -> {            
        String guid = UUID.randomUUID().toString().substring(0, 8).toUpperCase();       
        admin.put(guid, "API Started");
        
        lQuote.addListener();
        lReject.addListener();
        lDeal.addListener();
        
        // Get latest deal number
        int currentId = dealNumber.readCurrentId();
        
        // Set it + 1 in case the web server was reboot on the fly
        priceService.setCurrentId(currentId + 1);

        log.traceExit();
    };
}

Solution

  • A lot of the problem was using Java JDK version 15. The correct versions require Java 11.

    // Geode client dependency
    implementation 'org.springframework.geode:spring-geode-starter:1.2.8.RELEASE'    
    implementation 'org.springframework.data:spring-data-geode:2.2.8.RELEASE' 
    implementation 'org.springframework.boot:spring-boot-starter-tomcat'