当前位置:   article > 正文

Spingboot集成Redis之踩坑(二)序列化问题_at org.springframework.data.redis.serializer.strin

at org.springframework.data.redis.serializer.stringredisserializer.serialize

报错如下:

  1. java.lang.ClassCastException: com.test.demo.test.Role cannot be cast to java.lang.String
  2. at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:36)
  3. at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:126)
  4. at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:235)
  5. at com.test.demo.test.TestRedis.redis(TestRedis.java:25)
  6. at com.test.demo.test.Test.get(Test.java:29)
  7. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  8. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  9. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  10. at java.lang.reflect.Method.invoke(Method.java:498)
  11. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
  12. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  13. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
  14. at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  15. at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
  16. at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
  17. at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
  18. at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
  19. at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
  20. at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
  21. at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
  22. at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
  23. at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
  24. at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
  25. at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
  26. at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
  27. at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
  28. at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
  29. at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
  30. at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
  31. at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
  32. at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  33. at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
  34. at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
  35. at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
  36. at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

配置类如下(使用注解的方式实现配置类): 

  1. /**
  2. * Created on 2019/3/31.
  3. * Title: Simple
  4. * Description:配置類
  5. * Copyright: Copyright(c) 2019
  6. * Company:
  7. *
  8. * @author wy
  9. */
  10. @Configuration
  11. @Slf4j
  12. public class RedisConfig {
  13. @Value("${redis.host}")
  14. private String host;
  15. @Value("${redis.port}")
  16. private Integer port;
  17. @Value("${redis.password}")
  18. private String password;
  19. @Value("${redis.timeout}")
  20. private int timeout;
  21. @Value("${redis.pool.max-total}")
  22. private int maxTotal;
  23. @PostConstruct
  24. public void init()
  25. {
  26. log.info("ids redis host {}, port {}", this.host, this.port);
  27. }
  28. @Primary
  29. @Bean(name="redisConnectionFactory")
  30. public JedisConnectionFactory idsRedisConnectionFactory() {
  31. if (StringUtil.isBlank(this.host)) {
  32. log.info("No need to initialize ids redis.");
  33. return null;
  34. }
  35. JedisConnectionFactory factory = new JedisConnectionFactory();
  36. factory.setHostName(this.host);
  37. factory.setPort(this.port);
  38. factory.setDatabase(this.index);
  39. factory.setTimeout(this.timeout);
  40. factory.setUsePool(false);
  41. if (StringUtil.isNotBlank(this.password)) {
  42. factory.setPassword(this.password);
  43. log.info("idsRedisConnectionFactory setPassword {}", this.password);
  44. }
  45. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  46. jedisPoolConfig.setMaxTotal(this.maxTotal);
  47. factory.setPoolConfig(jedisPoolConfig);
  48. return factory;
  49. }
  50. @Primary
  51. @Bean(name="idsRedisTemplate")
  52. public RedisTemplate<String, String> idsRedisTemplate(@Qualifier("redisConnectionFactory")
  53. RedisConnectionFactory cacheRedisConnectionFactory) {
  54. if (null == cacheRedisConnectionFactory) {
  55. return null;
  56. }
  57. StringRedisTemplate template = new StringRedisTemplate(cacheRedisConnectionFactory);
  58. template.afterPropertiesSet();
  59. log.warn("set ids redis {}:{}", this.host, this.port);
  60. return template;
  61. }
  62. }

 

配置文件:

  1. #redis
  2. redis:
  3. ids:
  4. host: 127.0.0.1
  5. port: 6379
  6. password:
  7. timeout: 2000
  8. pool:
  9. max-active: 8
  10. max-idle: 8
  11. max-wait: -1
  12. min-idle: 0
  13. max-total: 10

测试代码:

  1. /**
  2. * Created on 2019/3/31.
  3. * Title: Simple
  4. * Description:測試類
  5. * Copyright: Copyright(c) 2018
  6. * Company:
  7. *
  8. * @author wy
  9. */
  10. @Service
  11. public class TestRedis {
  12. @Autowired
  13. private RedisTemplate redisTemplate;
  14. public void redis() {
  15. Role role = new Role();
  16. role.setId(10);
  17. role.setRoleName("CEO");
  18. redisTemplate.opsForValue().set("1", role);
  19. redisTemplate.opsForValue().set("role-1", role);
  20. Role role1 = (Role) redisTemplate.opsForValue().get("role-1");
  21. System.out.println(role1.getId() + "======" + role1.getRoleName());
  22. }
  23. }

解决方案:

出现这个的问题,主要是序列化失败,不指定序列化方式,默认应该是使用的JDK的二进制序列化方式,导致的强制转换失败,所以解决方案,是在配置类中进行指定序列化方式来进行序列化;

如下(指定序列化方式):

  1. template.setKeySerializer(new StringRedisSerializer());
  2. template.setHashKeySerializer(new StringRedisSerializer());
  3. template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
  4. template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

亲测,可以解决,如有遇到以上问题,可以定位下是否是因为Redis的序列化方式问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/318449
推荐阅读
相关标签
  

闽ICP备14008679号