2016-02-20 1 views
3

Selon this answer, un RedisTemplate ne peut pas prendre en charge plusieurs sérialiseurs pour les valeurs. Je veux donc créer plusieurs RedisTemplates pour différents besoins, en particulier un pour les actions de chaîne et un pour les sérialisations JSON, à utiliser dans RedisCacheManager. J'utilise Spring Boot et le RedisTemplate actuel est autowired, je me demande quelle est la bonne façon de déclarer une seconde instance RedisTemplate partage la même usine de connexion Jedis, mais a ses propres sérialiseurs?Comment créer une seconde instance RedisTemplate dans une application Spring Boot

ai essayé quelque chose comme ça en deux composants différents,

Composante 1 déclare,

@Autowired 
    private RedisTemplate redisTemplate; 

    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Instance.class)); 

Composante 2 déclare,

@Autowired 
    private StringRedisTemplate stringRedisTemplate; 

Dans ce cas, les deux modèles sont en fait la même chose. Tracé dans le code Spring et le modèle du composant 1 trouvé a été résolu en autoconfiguré stringRedisTemplate.

Le constructeur de RedisTemplate appelant manuellement puis son afterPropertiesSet() ne fonctionnera pas non plus car il se plaint qu'aucune usine de connexion ne peut être trouvée. Je sais que cette requête ne représente probablement pas une grande différence par rapport à la définition d'un autre bean dans une application Spring, mais je ne suis pas sûr de l'intégration actuelle de Spring-Data-Redis. S'il vous plaît, aidez, merci.

Répondre

3

vous pouvez suivre deux façons comment utiliser plusieurs RedisTemplate s au sein d'une application Spring Boot:

  1. injection de haricot nommé avec @Autowired @Qualifier("beanname") RedisTemplate myTemplate et créer le haricot avec @Bean(name = "beanname").
  2. Injection de type sécurisé en spécifiant des paramètres de type sur RedisTemplate (par exemple @Autowired RedisTemplate<byte[], byte[]> byteTemplate et @Autowired RedisTemplate<String, String> stringTemplate).

Voici le code pour créer deux différents:

@Configuration 
public class Config { 

    @Bean 
    public RedisTemplate<String, String> stringTemplate(RedisConnectionFactory redisConnectionFactory) { 

     RedisTemplate<String, String> stringTemplate = new RedisTemplate<>(); 
     stringTemplate.setConnectionFactory(redisConnectionFactory); 
     stringTemplate.setDefaultSerializer(new StringRedisSerializer()); 
     stringTemplate.afterPropertiesSet(); 

     return stringTemplate; 
    } 

    @Bean 
    public RedisTemplate<byte[], byte[]> byteTemplate(RedisConnectionFactory redisConnectionFactory) { 

     RedisTemplate<byte[], byte[]> byteTemplate = new RedisTemplate<>(); 
     byteTemplate.setConnectionFactory(redisConnectionFactory); 
     byteTemplate.afterPropertiesSet(); 

     return byteTemplate; 
    } 

} 

HTH, Mark

+0

Merci beaucoup, cela résout mon problème. Une question de suivi est quand je déclare un bean comme ceci, comment Spring sait passer dans la RedisConnectionFactory désirée pour moi? Cela est probablement dû au fait que je me familiarise avec le mécanisme de Spring, et j'apprécie si vous pouvez me renseigner à ce sujet. – Derek

+0

Lorsqu'il n'y a qu'une seule fabrique de connexions, pas de soucis. S'il y en a plusieurs, vous devez les qualifier à nouveau, sinon vous finirez par 'NoUniqueBeanDefinitionException'. – mp911de