Buggy code:
public abstract class CacheAspectSupport implements InitializingBean { public interface Invoker { Object invoke ( ) { } } protected final Log logger = LogFactory . getLog ( getClass ( ) ) ; private CacheManager cacheManager ; private CacheOperationSource cacheOperationSource ; private final ExpressionEvaluator evaluator = new ExpressionEvaluator ( ) ; private KeyGenerator keyGenerator = new DefaultKeyGenerator ( ) ; private boolean initialized = false ; private static final String CACHEABLE = "cacheable" ; private static final String UPDATE = "cacheupdate" ; private static final String EVICT = "cacheevict" ; public void setCacheManager ( CacheManager cacheManager ) { } public CacheManager getCacheManager ( ) { } public void setCacheOperationSources ( CacheOperationSource ... cacheOperationSources ) { } public CacheOperationSource getCacheOperationSource ( ) { } public void setKeyGenerator ( KeyGenerator keyGenerator ) { } public KeyGenerator getKeyGenerator ( ) { } public void afterPropertiesSet ( ) { } protected String methodIdentification ( Method method , Class < ? > targetClass ) { } protected Collection < Cache > getCaches ( CacheOperation operation ) { } protected CacheAspectSupport . CacheOperationContext getOperationContext ( CacheOperation operation , Method method , Object [ ] args , Object target , Class < ? > targetClass ) { } protected Object execute ( CacheAspectSupport . Invoker invoker , Object target , Method method , Object [ ] args ) { } private void inspectCacheEvicts ( Collection < CacheAspectSupport . CacheOperationContext > evictions ) { } private CacheAspectSupport . CacheStatus inspectCacheables ( Collection < CacheAspectSupport . CacheOperationContext > cacheables ) { } private static class CacheStatus { final Map < CacheAspectSupport . CacheOperationContext , Object > cUpdates ; final boolean updateRequired ; final Object retVal ; CacheStatus ( Map < CacheAspectSupport . CacheOperationContext , Object > cUpdates , boolean updateRequired , Object retVal ) { } } private Map < CacheAspectSupport . CacheOperationContext , Object > inspectCacheUpdates ( Collection < CacheAspectSupport . CacheOperationContext > updates ) { } private void update ( Map < CacheAspectSupport . CacheOperationContext , Object > updates , Object retVal ) { } private Map < String , Collection < CacheAspectSupport . CacheOperationContext > > createOperationContext ( Collection < CacheOperation > cacheOp , Method method , Object [ ] args , Object target , Class < ? > targetClass ) { } protected class CacheOperationContext { private final CacheOperation operation ; private final Collection < Cache > caches ; private final Object target ; private final Method method ; private final Object [ ] args ; private final EvaluationContext evalContext ; public CacheOperationContext ( CacheOperation operation , Method method , Object [ ] args , Object target , Class < ? > targetClass ) { } protected boolean isConditionPassing ( ) { } protected Object generateKey ( ) { if ( StringUtils . hasText ( this . operation . getKey ( ) ) ) { return evaluator . key ( this . operation . getKey ( ) , this . method , this . evalContext ) ; } <START_BUG> return keyGenerator . extract ( this . target , this . method , this . args ) ; <END_BUG> } protected Collection < Cache > getCaches ( ) { } } }

Fix:
return keyGenerator . generate ( this . target , this . method , this . args ) ;