Génération automatique de clés Ehcache et annotation de ressort @Cacheable

Est-ce que quelqu’un sait comment fonctionne la génération de clé par défaut pour Ehcache? Si j’ai la méthode suivante:

@Cacheable(cacheName = CACHE_KEY) // CACHE_KEY is static final field. public List list( int firstRecord, int maxRecords, int pageSize, FilterObject filter) { .... } 

FilterObject est un POJO personnalisé, à quoi dois-je m’attendre de la clé de cache réelle?

Ce que FilterObject c’est que lorsque FilterObject différentes instances de FilterObject sans changer les autres arguments de l’appel de ma méthode, le résultat est toujours identique: le résultat du premier appel est mis en cache et renvoyé.

C’est probablement le POJO FilterObject qui est à l’origine du problème (je suppose qu’il s’agit d’un problème de sérialisation ou de .toSsortingng() , car je n’ai pas remplacé les méthodes appropriées.

Je n’étais toujours pas en mesure de trouver des informations exactes sur la formation de la clé de cache pour cette méthode sur le site Web d’Ehcache et dans la documentation @Cacheable annotations @Cacheable . J’apprécierais toutes les informations et recommandations sur ce sujet.

C’est le générateur de clé par défaut

 public class DefaultKeyGenerator implements KeyGenerator { public static final int NO_PARAM_KEY = 0; public static final int NULL_PARAM_KEY = 53; public Object generate(Object target, Method method, Object... params) { if (params.length == 1) { return (params[0] == null ? NULL_PARAM_KEY : params[0]); } if (params.length == 0) { return NO_PARAM_KEY; } int hashCode = 17; for (Object object : params) { hashCode = 31 * hashCode + (object == null ? NULL_PARAM_KEY : object.hashCode()); } return Integer.valueOf(hashCode); } } 

Comme vous pouvez le constater, il combine les codes de hachage de chaque paramètre de méthode.

Tout est expliqué dans la documentation de référence de Spring, à savoir:

28.3.1.1 Génération de clé par défaut :

[…]

  • Si plus d’un paramètre est donné, retourne une clé calculée à partir des hachages de tous les parameters .

Pour fournir un autre générateur de clé par défaut, vous org.springframework.cache.KeyGenerator implémenter l’interface org.springframework.cache.KeyGenerator . Une fois configuré, le générateur sera utilisé pour chaque déclaration qui ne spécifie pas sa propre stratégie de génération de clé (voir ci-dessous).

et plus bas:

28.3.1.2 Déclaration de génération de clé personnalisée :

[…] l’annotation @Cacheable permet à l’utilisateur de spécifier comment la clé est générée via son atsortingbut key. Le développeur peut utiliser SpEL pour sélectionner les arguments d’intérêt […]

Et un exemple tiré de la documentation:

 @Cacheable(value="books", key="#isbn.rawNumber") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) 

Donc, dans votre cas, vous devriez simplement implémenter equals() et hashCode() pour FilterObject . Décent IDE peut les générer pour vous.