プロジェクトの元のシリアル化ソリューションでは JDK シリアル化クラスが使用されていましたが、それを Redis に保存すると文字化けしたコードが生成され、表示や管理が不便になります。
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { redisTemplate.setKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setHashKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); this.redisTemplate = redisTemplate; }
ネットで調べたところ、シリアル化クラスの問題によるもので、jdk のシリアル化メソッドを使用せず、json 形式を使用しています
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); this.redisTemplate = redisTemplate; }
上記のシリアライザーを使用する エンティティ クラスのすべての get メソッドに属性フィールドがあることを確認する必要があります。そうでない場合、会話を逆シリアル化するときに問題が発生します。 @JsonIgnore アノテーションを追加する必要がない場合、シリアル化中に無視されます。
SpringBoot は Redis を非常に簡単に紹介します。次のアノテーションを追加します。
次にアプリケーションでRedis 構成を yml に追加します:
注: ここにはパスワードなどの追加の構成がいくつかありますが、トラブルを避けるためにここには書きません。
テスト後、問題が見つかりました。test:1 のようなキーが文字化けしていました。たとえば、
Another.Redis.Desktop.Manager ツールを使用してこれを表示すると、一連の奇妙な文字列になることがわかりました。
が文字化けしています。
これは、Redis のデフォルトのシリアル化ルールが原因で発生します。 RedisTemplate のデフォルトのシリアル化ルールはすべて JDKSerializer であり、StringRedisTemplate のデフォルトのシリアル化ルールは StringRedisSerializer です。
package com.eknown.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * redis配置 * 主要是配置Redis的序列化规则,用Jackson2JsonRedisSerializer替换默认的jdkSerializer * @author zhangfanghao * @version 1.0 * @date 2019-07-21 21:04 */ @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); // 使用Jackson2JsonRedisSerialize替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 设置key和value的序列化规则 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
注: ここでリセットされるのは Key と Value のシリアル化ルールのみであり、ハッシュ キーとハッシュ値のシリアル化ルールは参照によって設定できます。
以上がSpringBoot で Redis シリアル化コードの文字化けを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。