轉載請註明出處:http://blog.csdn.net/qq_26525215
本文源自【大學之旅_諳憶的部落格】
今天在使用Redis的Map儲存Bean時,出現了一個問題。
問題如下:
java.lang.ClassCastException: com.uifuture.TestBean cannot be cast to java.lang.String at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:32) at org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:168) at org.springframework.data.redis.core.DefaultHashOperations.put(DefaultHashOperations.java:168) at org.springframework.data.redis.core.DefaultBoundHashOperations.put(DefaultBoundHashOperations.java:90) at com.uifuture.utils.RedisUtil.addMap(RedisUtil.java:299) at com.uifuture.utils.redis.SaveMapCallable.call(SaveMapCallable.java:33) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)
我項目使用的是 spring-data-redis管理Redis與序列化。
所以當時我在Spring設定檔中配置的時候,配置了
keySerializer :對於普通K-V操作時,key採取的序列化策略
valueSerializer:value採取的序列化策略
這2種序列化策略。
其實我是少配置了另外2個序列化策略。
造成的後果就是,儲存普通的Bean時,是不會出現問題的,也就導致了我從項目開始到現在過去了10多天,才遇到這個問題。
其實解決辦法很簡單,我少配置了
hashKeySerializer: 在hash資料結構中,hash-key的序列化策略
hashValueSerializer:hash-value的序列化策略
這兩個序列化策略。
當時我Spring的配置序列化的策略是:
<!-- 如果不配置Serializer,那麼儲存的時候只能使用String,如果用物件類型儲存,那麼會提示錯誤 can't cast to String。。。--> <property name="keySerializer"> <!--對key的預設序列化器。預設值是StringSerializer--> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--是對value的預設序列化器,預設值是取自DefaultSerializer的JdkSerializationRedisSerializer。--> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property>
需要再增加兩種,也就是改成:
<!-- 如果不配置Serializer,那麼儲存的時候只能使用String,如果用物件類型儲存,那麼會提示錯誤 can't cast to String。。。--> <property name="keySerializer"> <!--對key的預設序列化器。預設值是StringSerializer--> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--是對value的預設序列化器,預設值是取自DefaultSerializer的JdkSerializationRedisSerializer。--> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> <!--儲存Map時key需要的序列化配置--> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--儲存Map時value需要的序列化配置--> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property>
這樣就可以解決無法序列化Map的問題。
也就是,大家記得寫序列化策略的時候,記得一次把這四種都寫上。
我查這個錯誤的時候,硬是看了很多篇部落格才發現我少寫了。
搞得我都差點要直接自己搞個序列化和還原序列化的工具類了。
其他的一些Redis的基礎知識,工具類啊,就不寫出來了。畢竟只是一篇解決問題的部落格、
本文章由[諳憶]編寫, 所有權利保留。
歡迎轉載,分享是進步的源泉。
轉載請註明出處:http://blog.csdn.net/qq_26525215
本文源自【大學之旅_諳憶的部落格】