2016-03-31 1 views
0

I m en utilisant org.springframework.cache.annotation.Cacheable pour le cache de niveau de la méthodeCréation d'un champ d'instance en tant que clé de cache?

public class Customer { 

private Long id; 

@Cacheable("customer",key="this.id") 
public CustomerAddress findCustomerAddress() {...} 

} 

Je veux mettre en cache l'objet client clé comme id. Mais je n'ai pas id comme paramètre de méthode. Je l'ai comme champ d'instance?

+1

Chaque 'Client' est-il géré par Spring pour commencer? Une approche plus habituelle consiste à utiliser '@ Cacheable' dans votre couche de service/DAO, pas directement sur les objets de domaine (qui ne seraient généralement pas gérés par Spring). En d'autres termes: vous résolvez ce problème en déplaçant 'findCustomerAddress' sur la couche de service et en envoyant l'ID de l'utilisateur comme paramètre d'entrée. – kryger

+0

Oui, le client est un haricot géré par le printemps. Ce code est en couche de service uniquement. Je viens de donner un exemple de ce que je veux réaliser – emilly

+0

Est-ce que CustomerAddress.id est la propriété que vous voulez utiliser comme clé de cache? –

Répondre

0

Vous ne pouvez pas faire facilement que et le code ci-dessus a deux odeurs OMI:

  • Vous essayez de mettre en cache un address dans un cache customer
  • L'objet que vous essayez de cache ne ne semble pas avoir sa propre identité. Vous seriez alors en cache plutôt le Customer (qui a une) plutôt qu'un sous-composante

Vous avez déjà eu de grands commentaires à votre question initiale et je vous suggère de revoir votre conception actuelle de sorte que l'objet le cache a sa propre identité. Si vous ne pouvez pas ou ne voulez pas, il y a toujours un moyen.

@Cacheable(cacheNames = "customer", keyGenerator="customerKeyGenerator") 
public CustomerAddress findCustomerAddress() {...} 

} 

Et puis dans une @Configuration classe

@Bean 
public KeyGenerator customerKeyGenerator() { 

} 

L'API de KeyGenerator est assez simple. Vous pouvez par exemple vérifier que l'instance cible est Customer, puis récupérer la valeur de l'ID.