0

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 );
    }
}
Don Rhummy
  • 24,730
  • 42
  • 175
  • 330

1 Answers1

0

Something to keep in mind is that if you have defined a key in the Cacheable annotation, that the key generator is not utilised. Ensure these are removed to validate