首页 > 解决方案 > 为休眠二级缓存 RegionFactory 重用 RedissonClient bean

问题描述

我有一个使用休眠(5.4.15.Final)和spring-session-data-redis的spring boot(2.3.0.RELEASE)应用程序。会话使用redisson持久化到 redis 。Redisson 客户端以编程方式创建并作为 Bean 公开。

有没有办法重新使用上面的bean。

我试过的:

我创建了以下类,它尝试通过扩展 RedissonRegionFactory 来注入RedissonClient

@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;
    }
}

但是RedissonClient在构造函数中为 null 并抛出以下堆栈跟踪。

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

它看起来正在尝试调用无参数构造函数,但没有。我尝试使用 setter 注入添加无参数构造函数,但未注入客户端。

标签: spring-boothibernatedependency-injectionsecond-level-cacheredisson

解决方案


推荐阅读