2014-02-10 69 views
15

我正在使用Spring Redis支持將我的對象保存在Redis中。Spring RedisTemplate:將多個模型類序列化爲JSON.Need以使用多個RedisTemplates?

我有幾個的DAO其處理不同的模型類:

如:「ShopperHistoryDao」這將節省/檢索「ShopperHistoryModel」 「ShopperItemHistoryDao」將處理「ItemHistoryModel」

我的目標對象想要使用'JacksonJsonRedisSerializer'來串行化/反序列化json對象。

但是在JacksonJsonRedisSerializer的構造函數中,它需要一個特定的Model類。

JacksonJsonRedisSerializer(Class<T> type) 

這是否意味着,我必須配置單獨的RedisTemplates爲每個不同的模型類,並在適當的DAO實現使用它們?

喜歡的東西:

<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

老,但也許可以延長'redisJson Serializer'並使用fasterxml的'。傑克遜「,以使其更通用。即不是強迫它被綁定到單一的類定義? – oak

回答

4

是的,RedisTemplate似乎被設計成具有的價值序列化的一個實例。

我會建議有RedisSerializer其中包含一個地圖內串行的,所以你可以使用一個RedisTemplate與可處理多種類型的串行的可能的解決方法 - 但由於RedisSerializer不提供像boolean canDeserialize(..)方法(如Spring MVC中的HTTP MessageConverters),這似乎不可能。

所以看起來你堅持有多個RedisTemplate實例。

1

舊線的一點,但你可以做這樣的事情:

<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> 

然後在您的Java類

@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應該做的工作

@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; 
    } 

這將添加@ Class屬性給JSON給你瞭解類型,這有助於Jackson反序列化,因此不需要在配置類中明確映射模型。

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

在服務,您可以使用緩存

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

檢查本文的模型:https://blog.pranavek.com/2016-12-25-integrating-redis-with-spring-application/

+0

公共列表 findWhitePapersByTitle(String title)?? –

+0

@SachinSharma這也將工作。 – Pranav

相關問題