2014-02-10 5 views
15

Ich verwende die Spring Redis-Unterstützung, um meine Objekte in Redis zu speichern.Spring RedisTemplate: Serialisieren Sie mehrere Model-Klassen in JSON.Müssen Sie mehrere RedisTemplates verwenden?

Ich habe mehrere DAOs, die verschiedene Modellklassen behandeln:

zB: ‚ShopperHistoryDao‘, die Objekte von ‚ShopperHistoryModel‘ sparen/abrufen ‚ShopperItemHistoryDao‘, die

ich Objekte von ‚ItemHistoryModel‘ behandelt möchte 'JacksonJsonRedisSerializer' verwenden, um meine Objekte zu/von json zu serialisieren/deserialisieren.

Aber im Konstruktor von JacksonJsonRedisSerializer braucht es eine bestimmte Model-Klasse.

JacksonJsonRedisSerializer(Class<T> type) 

Heißt das, habe ich getrenntes RedisTemplates für jede unterschiedliche Modellklasse und nutzen sie in entsprechender DAO Implementierung konfigurieren?

Etwas wie:

<bean id="redisTemplateForShopperHistoryModel" class="org.springframework.data.redis.core.RedisTemplate"> 
    <property name="connectionFactory" ref="jedisConnectionFactory" /> 
    <property name="valueSerializer"> 
     <bean id="redisJsonSerializer" 
         class="org.springframework.data.redis.serializer.JacksonJsonRedisSerializer"> 
      <constructor-arg type="java.lang.Class" value="ShopperHistoryModel.class"/> 
     </bean> 
    </property> 
</bean> 


<bean id="redisTemplateForItemHistoryModel" class="org.springframework.data.redis.core.RedisTemplate"> 
    <property name="connectionFactory" ref="jedisConnectionFactory" /> 
    <property name="valueSerializer"> 
     <bean id="redisJsonSerializer" 
         class="org.springframework.data.redis.serializer.JacksonJsonRedisSerializer"> 
      <constructor-arg type="java.lang.Class" value="ItemHistoryModel.class"/> 
     </bean> 
    </property> 
</bean> 
+0

alt, aber vielleicht kann man 'redisJson Serializer' erweitern und die Verwendung von' fasterxml machen:

"{\"@class\":\"com.prnv.model.WhitePaper\",\"title\":\"Hey\",\"author\":{\"@class\":\"com.prnv.model.Author\",\"name\":\"Hello\"},\"description\":\"Description\"}" 

Im Service können Sie das Modell

@Cacheable(value = "whitePaper", key = "#title") public WhitePaper findWhitePaperByTitle(String title) { WhitePaper whitePaper = repository.findByTitle(title); return whitePaper; } 

Überprüfen Sie diesen Artikel mit zwischenzuspeichern. Jackson, um es generischer zu machen. d. h. es nicht zwingen, an eine einzelne Klassendefinition gebunden zu sein? – oak

Antwort

4

Ja, scheint die RedisTemplate gestaltet werden, um eine einzelne Instanz des Wertes Serializer haben.

Ich wollte die mögliche Abhilfe vorzuschlagen eine RedisSerializer zu haben, die eine Karte von inneren Serializer enthält, so dass Sie ein RedisTemplate mit einem Serializer verwenden können, die mehrere Arten umgehen kann - aber da RedisSerializer keine Methoden bieten wie boolean canDeserialize(..) (wie die HTTP MessageConverter im Frühjahr MVC haben) dies scheint nicht möglich.

So scheint es, dass Sie mit mehreren RedisTemplate Instanzen fest sind.

1

Ein bisschen alten Thread, aber man kann so etwas tun:

<bean id="RedisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> 
    <property name="connectionFactory" ref="jedisConnectionFactory" /> 
    <property name="valueSerializer"> 
     <bean id="jackson2JsonRedisSerializer" 
         class="org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer"> 
      <constructor-arg type="java.lang.Class" value="Object.class" /> 
     </bean> 
    </property> 
</bean> 

Dann

in Ihre Java-Klasse
@Autowire 
private RedisTemplate redisTemplate; 

public void save(Model model) { 
    ObjectMapper obmap = new ObjectMapper(); 
    redisTemplate.opsForHash().putAll(mode.getId(), obmap.convertValue(model, Map.class)); 
} 
10

GenericJackson2JsonRedisSerializer

die Arbeit machen sollte
@Bean 
    public RedisTemplate<String, Object> redisTemplate() { 
     RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); 
     redisTemplate.setConnectionFactory(jedisConnectionFactory()); 
     redisTemplate.setKeySerializer(new StringRedisSerializer());           
     redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); 
     return redisTemplate; 
    } 

Diese fügt @Class Eigenschaft dem JSON zu Ihnen hinzu Verstehen Sie den Typ, der Jackson hilft, zu deserialisieren, also muss das Modell nicht explizit der Konfigurationsklasse zugeordnet werden. https://blog.pranavek.com/2016-12-25-integrating-redis-with-spring-application/

+0

was ist mit der öffentlichen Liste? findWhitePapersByTitle (String title) ?? –

+0

@SachinSharma Das wird auch funktionieren. – Pranav

Verwandte Themen