Redis儲存Hash-Map時無法序列化問題__string

來源:互聯網
上載者:User

轉載請註明出處: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

本文源自【大學之旅_諳憶的部落格】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.