首先说说,我碰到这个情况

我有个老项目是spring mvc的  然后用的redis 版本是1.6.2的版本,这个项目在使用中,所以redis里面存了很多登录缓存,,然后我又开了一个新项目,但是登陆是通用数据库,新项目是springboot的 用的redis是2.0.6的

那么问题出来了 Could not read JSON: Unexpected character ('¬' (code 172)) 这个异常通常是说的序列化失败

先看看springMVC的配置

	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
		<property name="connectionFactory"   ref="jedisConnFactory" />
		<property name="keySerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
		</property>
		<property name="valueSerializer">
			<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"></bean>
		</property>
		<!--开启事务  -->
		<!--<property name="enableTransactionSupport" value="true"></property>-->
	</bean>

 

keySerializer 的序列化 使用的是 StringRedisSerializer
valueSerializer 的序列化 使用的是 JdkSerializationRedisSerializer

那么在看看springboot的配置

@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

keySerializer 的序列化 使用的是  stringRedisSerializer

valueSerializer 的序列化 使用的是  jackson2JsonRedisSerializer

那么问题来了,value 的序列化方式不一样 所以我们需要更改一下

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(jdkSerializationRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setHashValueSerializer(jdkSerializationRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

都改成jdk序列化方式就没问题啦

但是,经过我的测试 我又发现了一个新的问题

首先在存入mvc 中 redis 数据的时候 我存的是对象 ,然后在boot中取的时候是取不出来的,因为包名不匹配,所以记得在redis中不要存对象,一定要先把对象序列化成json

JSON.toJSONString(对象);

这里使用的是 阿里的 com.alibaba.fastjson.JSON 包

然后取出的时候 可以反序列化成对象

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐