I have a spring boot(2.3.0.RELEASE) application which uses hibernate(5.4.15.Final) and spring-session-data-redis. Sessions are persisted to redis using redisson. The Redisson client is created programmatically and is exposed as a Bean.
Is there a way to re-use the above bean.
What I have tried:
I have created the following class that tries to inject the RedissonClient by extending RedissonRegionFactory
@DependsOn("redis-client")
public class RedissonCachingConfiguration extends RedissonRegionFactory {
private RedissonClient redissonClient;
@Autowired
public RedissonCachingConfiguration(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
@Override
protected RedissonClient createRedissonClient(Map properties) {
return redissonClient;
}
}
But RedissonClient
is null in the constructor and the following stack trace is thrown.
Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Could not instantiate named strategy class [com.sso.relay.configuration.RedissonCachingConfiguration]
at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:247) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:192) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.cache.internal.RegionFactoryInitiator.resolveRegionFactory(RegionFactoryInitiator.java:93) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:47) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:32) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
... 15 common frames omitted
Caused by: org.hibernate.service.spi.ServiceException: Unable to call constructor of RegionFactory impl [com.sso.relay.configuration.RedissonCachingConfiguration]
at org.hibernate.cache.internal.StrategyCreatorRegionFactoryImpl.create(StrategyCreatorRegionFactoryImpl.java:65) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.cache.internal.StrategyCreatorRegionFactoryImpl.create(StrategyCreatorRegionFactoryImpl.java:23) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:243) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
... 21 common frames omitted
Caused by: java.lang.InstantiationException: com.sso.relay.configuration.RedissonCachingConfiguration
at java.base/java.lang.Class.newInstance(Class.java:571) ~[na:na]
at org.hibernate.cache.internal.StrategyCreatorRegionFactoryImpl.create(StrategyCreatorRegionFactoryImpl.java:62) ~[hibernate-core-5.4.15.Final.jar:5.4.15.Final]
... 23 common frames omitted
Caused by: java.lang.NoSuchMethodException: com.sso.relay.configuration.RedissonCachingConfiguration.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3349) ~[na:na]
at java.base/java.lang.Class.newInstance(Class.java:556) ~[na:na]
... 24 common frames omitted
It looks to be trying to call the no-args constructor but there isn't one. I have tried adding a no-args constructor with setter injection but the client isn't injected.