Comment puis-je dire de Printemps cache pas cache valeur null dans @Cacheable annotation
Est-il un moyen de préciser que, si la méthode renvoie la valeur null, alors ne pas mettre en cache le résultat de @Cacheable annotation pour une méthode de ce genre?
@Cacheable(value="defaultCache", key="#pk")
public Person findPerson(int pk) {
return getSession.getPerson(pk);
}
Mise à jour:
voici le TABLEAU de problème soumis en ce qui concerne la mise en cache valeur null en novembre dernier, qui n'a pas encore résolue:
[#SPR-8871] @Cachable condition doit permettre le référencement valeur de retour - Printemps Projets bug Tracker
- Salut, je pense que vous devriez Technologie Voyage de réponse acceptée, parce qu'il est plus pertinent pour la version actuelle de Printemps.
Vous devez vous connecter pour publier un commentaire.
Hourra, dès le Printemps 3.2 le cadre permet à l'aide de Printemps SPEL et
unless
. Note de la java doc entourant Cacheable:http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/cache/annotation/Cacheable.html
L'aspect important est que
unless
est évaluée d'après la méthode a été appelée. Cela fait beaucoup de sens parce que la méthode ne sera jamais exécuté si la clé est déjà dans le cache.Ainsi, dans l'exemple ci-dessus, il vous suffit d'annoter comme suit (#résultat est disponible pour tester la valeur de retour d'une méthode):
J'imagine que cette condition découle de l'utilisation de enfichables implémentations de cache comme Ehcache qui permet la mise en cache de la valeur null. En fonction de votre scénario de cas d'utilisation cela peut ou peut ne pas être souhaitable.
condition
argument, qui peut être utilisé ainsi. Dans mon cas, j'avais besoin decondition="#pk != null"
de sorte que lorsque l'argument estnull
la mise en cache ne serait pas jeterhv000028: unexpected exception during isvalid call
🙂mise à jour cette réponse est obsolète aujourd'hui, pour le Printemps 3.2 et versions ultérieures voir Technologie Voyage de l' réponse, OP: n'hésitez pas à le marquer comme acceptée.
Je ne pense pas que c'est possible(même si il y a conditionnelle Cache expulsion de Printemps qui peuvent être exécutées après l'invocation de la méthode avec
@CacheEvict
paramètre beforeInvocation défini à false, ce qui est la valeur par défaut) l'examen de laCacheAspectSupport
classe montre que la valeur retournée n'est pas stockée avant lainspectAfterCacheEvicts(ops.get(EVICT));
appel.Si le Printemps annotation
ne fonctionne pas ,vous pouvez essayer:
Cela fonctionne pour moi.
unless="#result == null"
?unless="#result==null"
qui signifie Cache, sauf si résultat == null qui signifie Cache si la suite!!! = null.