Redis序列化对象的时候报错如下

java.lang.ClassCastException: com.ppdai.cbd.ddp.thirdparty.contract.bhxtzx.BHXTZXTask cannot be cast to java.lang.Stringat org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:33)at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:117)at org.springframework.data.redis.core.DefaultListOperations.leftPush(DefaultListOperations.java:71)at org.springframework.data.redis.core.DefaultBoundListOperations.leftPush(DefaultBoundListOperations.java:60)at com.ppdai.realtime.datachannel.pullservice.entity.RedisQueue.pushFromHead(RedisQueue.java:63)at com.ppdai.realtime.datachannel.pullservice.redisconfig.RedisTaskSender.sendTask(RedisTaskSender.java:35)at com.ppdai.realtime.datachannel.pullservice.redisconfig.RedisTaskSender$sendTask.call(Unknown Source)at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)

BHXTZXTask是自己定义的Bean,因此问题就变成了自定义的对象不能转成String对象,为什么会需要转成String对象呢

因为redis默认使用jdkSerializer,看RedisTemplate的代码如下,

afterPropertiesSet函数
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {public void afterPropertiesSet() {super.afterPropertiesSet();boolean defaultUsed = false;if (defaultSerializer == null) {defaultSerializer = new JdkSerializationRedisSerializer(classLoader != null ? classLoader : this.getClass().getClassLoader());}if (enableDefaultSerializer) {if (keySerializer == null) {keySerializer = defaultSerializer;defaultUsed = true;}if (valueSerializer == null) {valueSerializer = defaultSerializer;defaultUsed = true;}if (hashKeySerializer == null) {hashKeySerializer = defaultSerializer;defaultUsed = true;}if (hashValueSerializer == null) {hashValueSerializer = defaultSerializer;defaultUsed = true;}}if (enableDefaultSerializer && defaultUsed) {Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");}if (scriptExecutor == null) {this.scriptExecutor = new DefaultScriptExecutor<K>(this);}initialized = true;}
}

查看源码,如下,通过rawValue()函数获取序列化之后的字节码

public Long leftPush(K key, V value) {final byte[] rawKey = rawKey(key);final byte[] rawValue = rawValue(value);return execute(new RedisCallback<Long>() {public Long doInRedis(RedisConnection connection) {return connection.lPush(rawKey, rawValue);}}, true);}
private byte[] rawValue(Object value) {   if (valueSerializer == null && value instanceof byte[]) {      return (byte[]) value;   }   return valueSerializer.serialize(value);}
 

通过 valueSerializer序列化来序列化对象, redis如果不配置,默认 valueSerializer的序列化是会使用

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();System.out.println(redisTemplate.hasKey("bohai_credit"));redisTemplate.delete("bohai_credit");System.out.println(stringRedisSerializer.serialize("bohai_credit"));System.out.println(jdkSerializationRedisSerializer.serialize("bohai_credit"));

[B@21831984
[B@4488db1f

运行结果如上所示。

转载于:https://www.cnblogs.com/zhengwangzw/p/9965406.html

Redis 自定义对象 cannot be cast to java.lang.String相关推荐

  1. cannot be cast to linux 环境,[Redis] ** cannot be cast to java.lang.String

    先上问题: java.lang.ClassCastException: com.ppdai.cbd.ddp.thirdparty.contract.bhxtzx.BHXTZXTask cannot b ...

  2. java.lang.ClassCastException: [B cannot be cast to java.lang.String

    java.lang.ClassCastException: [B cannot be cast to java.lang.String 错误代码行: public int addZTIncome(ZT ...

  3. SpringBoot统一返回处理出现cannot be cast to java.lang.String异常

    SpringBoot统一返回处理出现cannot be cast to java.lang.String异常 一 问题出现背景: 二 解决方案 三 异常原因分析 原因: 源码详细分析: 正常返回: 返 ...

  4. SpringBoot 提示转换异常:java.lang.ClassCastException: com.*** cannot be cast to java.lang.String

    功能要求:查看之前自己编写的Controller层没有通用响应,所以基于Spring Aop 面向切面添加统一结果输出. 上述功能实现后,进行简单的单元测试,出现如下错误: java.lang.Cla ...

  5. java.lang.ClassCastException: cn.tedu.domain.User cannot be cast to java.lang.String

    java.lang.ClassCastException: cn.tedu.domain.User cannot be cast to java.lang.String问题解决 从图中可以看到的map ...

  6. 在拦截器中获取请求参数,[Ljava.lang.String; cannot be cast to java.lang.String报错

    Map<String,Object> parametersmap=invocation.getInvocationContext().getParameters();//获取请求参数    ...

  7. Java报错:java.math.BigDecimal cannot be cast to java.lang.String

    从数据库取数字,转为string,报错: java.math.BigDecimal cannot be cast to java.lang.String 错误代码 Integer.parseInt(( ...

  8. “无效数字” ;java.lang.Integer cannot be cast to java.lang.String

    今天页面上突然查询不出数据,大致的sql语句是 select xx ,xxx from table a where a.lrmb in ( 6101060033, 61010503300, 61016 ...

  9. 已解决java.lang.Integer cannot be cast to java.lang.String异常的正确解决方法,亲测有效!!!

    已解决java.lang.Integer cannot be cast to java.lang.String异常的正确解决方法,亲测有效!!! 文章目录 报错问题 解决方法 福利 报错问题 1.在执 ...

最新文章

  1. 投稿数翻倍,接收率不到三成!史上最难的ECCV你中了吗?
  2. Linux 学习日记 3: 环境变量与文件查找
  3. win32: 查询滚动条相关信息的注意事项
  4. 使用Xshell生成key,避免password登录linux
  5. 简单实现一边固定,另一边自适用
  6. iOS本地化项目上传到gitHub
  7. BeautifulSoup库使用
  8. 飞鸽改变您的互联网生活
  9. MyEclipse下XFire开发Webservice实例
  10. c语言abc变def,C语言的permutation求解
  11. 吴恩达老师经验:80%的数据+20%的模型=更好的机器学习
  12. 京东公布618第一小时战报:成交金额同比增长65%
  13. 论Postgres的“已提交的而且 xmin’比当前事务的XID小的记录对当前事务才是可见的”...
  14. Ubuntu的LAMP与相关软件安装设置
  15. 局域网助手_IP地址管理和局域网远程助手
  16. 空间索引 - Redis/MongoDB/PostgreSQL/MySQL空间索引使用报告
  17. 据说中国电信将ADSL的80端口给封了
  18. 【unity shader】毛绒材质效果的实现
  19. 如何优化我的世界服务器,我的世界服务器太卡怎么办 MC服务器优化攻略
  20. 2021全国省市区街道社区五级SQL文件以及JAVA爬取代码

热门文章

  1. 北京气象局回应为何不发短信预警:存技术障碍。(你信吗)
  2. 建筑施工技术【19】
  3. 关于Time dependence
  4. 北航计算机考博经验,考博经验——说说我北邮北航考博经历
  5. Meta元宇宙内容VP:VR游戏与元宇宙关系紧密,社交并非全部
  6. (Python3)L1-007 念数字 (10分)
  7. 属性重要性的举例(定性数据聚类)
  8. android webview全屏显示html内容
  9. 数据化管理:洞悉零售及电子商务运营 | 学习笔记 (全)
  10. 阿里 P9 开源分享内部 Java 核心开发手册(2022 版)覆盖 P5 到 P8