I have a custom key generator and it only gets called if I use the "keyGenerator"
property in the @Cachehable
annotation.
My configuration class that creates it is pulled in as a gradle dependency (and is loaded and my key generator is created.).
Config:
@EnableCaching
@Configuration
public class CacheKeyConfig extends CachingConfigurerSupport
{
private static final Logger LOGGER = LoggerFactory.getLogger( CacheKeyConfig.class );
@Bean
@Primary
public KeyGenerator keyGenerator(@Autowired( required = false ) List<CacheKeyGenerator> keyGenerators)
{
return new DynamicCacheKeyGenerator( keyGenerators );
}
}
The list I pass it is a set of key generators the developer can create (as beans) that can be used for a specific cache resolver/manager. So it allows a different key generator for MemCache, or Redis or EhCache (if you were to use multiple in one project). But this can be an empty list.
The key generator:
public class DynamicCacheKeyGenerator implements KeyGenerator
{
private static Logger LOGGER = LoggerFactory.getLogger( DynamicCacheKeyGenerator.class );
private Map<Method, CacheKeyGenerator> keyGenerators = new HashMap<>();
@Autowired
public DynamicCacheKeyGenerator(List<CacheKeyGenerator> keyGenerators)
{
//Map the generators to the resolvers
mapGeneratorsToResolvers( CacheResolverFinder.getMethodCacheResolvers(), keyGenerators );
}
//...elided...
@Override
public Object generate(Object target, Method method, Object... params)
{
//Try to get the cache key handler for this method
CacheKeyGenerator generator = keyGenerators.get( method );
//...elided...
return generator.generate( target, method, params );
}
}
The following will never use my key generator:
@Cacheable( value = "MyCache", cacheResolver = "MyResolver" )
But the following does use it:
@Cacheable( value = "MyCache", cacheResolver = "MyResolver", keyGenerator = "keyGenerator" )
How do I get mine to be the default?
EDIT: Even changing to the following does not use my key generator:
@EnableCaching
@Configuration
public class CacheKeyConfig extends CachingConfigurerSupport
{
private static final Logger LOGGER = LoggerFactory.getLogger( CacheKeyConfig.class );
@Autowired
private List<CacheKeyGenerator> myKeyGenerators;
//This DOES get called
@Override
public KeyGenerator keyGenerator()
{
return new DynamicCacheKeyGenerator( myKeyGenerators );
}
}