ホームページ  >  記事  >  データベース  >  SpringBoot で Redis シリアル化コードの文字化けを解決する方法

SpringBoot で Redis シリアル化コードの文字化けを解決する方法

王林
王林転載
2023-05-27 11:34:061814ブラウズ

SpringBoot での Redis シリアル化コードが文字化けする

プロジェクトの元のシリアル化ソリューションでは 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 シリアル化ルールを構成します

SpringBoot は Redis を非常に簡単に紹介します。次のアノテーションを追加します。

SpringBoot で Redis シリアル化コードの文字化けを解決する方法

次にアプリケーションでRedis 構成を yml に追加します:

SpringBoot で Redis シリアル化コードの文字化けを解決する方法

注: ここにはパスワードなどの追加の構成がいくつかありますが、トラブルを避けるためにここには書きません。

これでテスト クラスを作成できます

SpringBoot で Redis シリアル化コードの文字化けを解決する方法

テスト後、問題が見つかりました。test:1 のようなキーが文字化けしていました。たとえば、

Another.Redis.Desktop.Manager ツールを使用してこれを表示すると、一連の奇妙な文字列になることがわかりました。

が文字化けしています。

これは、Redis のデフォルトのシリアル化ルールが原因で発生します。 RedisTemplate のデフォルトのシリアル化ルールはすべて JDKSerializer であり、StringRedisTemplate のデフォルトのシリアル化ルールは StringRedisSerializer です。

詳細については、下の図をご覧ください。

SpringBoot で Redis シリアル化コードの文字化けを解決する方法

SpringBoot で Redis シリアル化コードの文字化けを解決する方法

設定する必要があります

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。