Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No CacheResolver specified, and no unique bean of type CacheManager found

I am trying to use two Different types of Cache in my Spring boot application,based on Rest API called I hvae to store data in my cache. But during project deploy stage I am getting below error.

[main] ERROR o.s.boot.SpringApplication - Application startup failed 2020-06-30T11:15:17.05+0530 [APP/PROC/WEB/0] OUT java.lang.IllegalStateException: No CacheResolver specified, and no unique bean of type CacheManager found. Mark one as primary (or give it the name 'cacheManager') or declare a specific CacheManager to use, that serves as the default one.

Can I specify @Primary on one cache manager ?I hope it does not stop storing data into another cache . Or is their a better way of doing this?

CacheConfig.java

@Profile("cloud")
public class CacheConfig extends AbstractCloudConfig {

@Autowired
Environment env;

@Bean
public RedisConnectionFactory brRedisFactory() {
    return connectionFactory().redisConnectionFactory(env.getProperty("redis_cache"));
}

@Bean
public RedisTemplate<String, Object> brRedisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
    redisTemplate.setConnectionFactory(brRedisFactory());
    return redisTemplate;
}

@Bean(name = "firstCacheMngr")
public CacheManager cacheManager() {
    RedisCacheManager cacheManager = new RedisCacheManager(brRedisTemplate());
    cacheManager.setUsePrefix(true);
    cacheManager.setTransactionAware(true);
    return cacheManager;
}

@Bean(name = "secondCacheMngr")
public CacheManager springCacheManager() {
    SimpleCacheManager cacheManager = new SimpleCacheManager();
    cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("secondCache")));
    return cacheManager;
}

}

This is how I am storing data in redis cache-

@Cacheable(value="redis-cache",key ="#customerId",cacheManager = "firstCacheMngr")
public CustomerInfo retriveCustomerdetails(String customerId
        String quarterEndDate)  {
     //Calling Rest API 
    }
    return customerInfo;
}
like image 995
Loren Avatar asked Oct 25 '25 05:10

Loren


1 Answers

you can put one as @Primary and inject the another one by using @Qualifier

@Bean(name = "firstCacheMngr")
public CacheManager cacheManager() {
    RedisCacheManager cacheManager = new RedisCacheManager(brRedisTemplate());
    cacheManager.setUsePrefix(true);
    cacheManager.setTransactionAware(true);
    return cacheManager;
}

@Bean(name = "secondCacheMngr")
@Primary
public CacheManager springCacheManager() {
    SimpleCacheManager cacheManager = new SimpleCacheManager();
    cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("secondCache")));
    return cacheManager;
}

and then use the redisCachManager as

    @Autowired
    @Qualifier("firstCacheMngr")
    private CacheManager cacheManager;
like image 109
gaetan224 Avatar answered Oct 26 '25 19:10

gaetan224



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!