报错如下:
java.lang.ClassCastException: com.test.demo.test.Role cannot be cast to java.lang.String
at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:36)
at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:126)
at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:235)
at com.test.demo.test.TestRedis.redis(TestRedis.java:25)
at com.test.demo.test.Test.get(Test.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
配置类如下(使用注解的方式实现配置类):
/**
* Created on 2019/3/31.
* Title: Simple
* Description:配置類
* Copyright: Copyright(c) 2019
* Company:
*
* @author wy
*/
@Configuration
@Slf4j
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Value("${redis.password}")
private String password;
@Value("${redis.timeout}")
private int timeout;
@Value("${redis.pool.max-total}")
private int maxTotal;
@PostConstruct
public void init()
{
log.info("ids redis host {}, port {}", this.host, this.port);
}
@Primary
@Bean(name="redisConnectionFactory")
public JedisConnectionFactory idsRedisConnectionFactory() {
if (StringUtil.isBlank(this.host)) {
log.info("No need to initialize ids redis.");
return null;
}
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(this.host);
factory.setPort(this.port);
factory.setDatabase(this.index);
factory.setTimeout(this.timeout);
factory.setUsePool(false);
if (StringUtil.isNotBlank(this.password)) {
factory.setPassword(this.password);
log.info("idsRedisConnectionFactory setPassword {}", this.password);
}
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(this.maxTotal);
factory.setPoolConfig(jedisPoolConfig);
return factory;
}
@Primary
@Bean(name="idsRedisTemplate")
public RedisTemplate<String, String> idsRedisTemplate(@Qualifier("redisConnectionFactory")
RedisConnectionFactory cacheRedisConnectionFactory) {
if (null == cacheRedisConnectionFactory) {
return null;
}
StringRedisTemplate template = new StringRedisTemplate(cacheRedisConnectionFactory);
template.afterPropertiesSet();
log.warn("set ids redis {}:{}", this.host, this.port);
return template;
}
}
配置文件:
#redis
redis:
ids:
host: 127.0.0.1
port: 6379
password:
timeout: 2000
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
max-total: 10
测试代码:
/**
* Created on 2019/3/31.
* Title: Simple
* Description:測試類
* Copyright: Copyright(c) 2018
* Company:
*
* @author wy
*/
@Service
public class TestRedis {
@Autowired
private RedisTemplate redisTemplate;
public void redis() {
Role role = new Role();
role.setId(10);
role.setRoleName("CEO");
redisTemplate.opsForValue().set("1", role);
redisTemplate.opsForValue().set("role-1", role);
Role role1 = (Role) redisTemplate.opsForValue().get("role-1");
System.out.println(role1.getId() + "======" + role1.getRoleName());
}
}
解决方案:
出现这个的问题,主要是序列化失败,不指定序列化方式,默认应该是使用的JDK的二进制序列化方式,导致的强制转换失败,所以解决方案,是在配置类中进行指定序列化方式来进行序列化;
如下(指定序列化方式):
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
亲测,可以解决,如有遇到以上问题,可以定位下是否是因为Redis的序列化方式问题。