SpringBoot 統合 Redis に保存されたオブジェクトが文字化けする問題を解決する方法

王林
リリース: 2023-05-28 09:25:05
転載
1712 人が閲覧しました

springboot 統合 Redis ストレージ オブジェクトの文字化けコード

実際、これは本質的には文字化けコードの一種ではなく、シリアル化後に保存されたものにすぎません。シリアル化されていない場合、エラーが報告され、シリアル化後に取得されたデータは必要なデータではありません。このメソッドを解決するには、StringRedisTempleteを使用できます。

コードについてはあまり言う必要はありません

redistemplete をデフォルトで使用する場合

/**
 * title: list
 *
 *  当我们保存到redis中的是一个对象时,我们会发现会报错,提示我们需要序列化 ,
 *  当我们继承了序列化接口之后,查看设置的值时,我们发现设置的值不是原来的样字,
 *  此时我们可以通过两种方式解决
 *      1.
 *
 * @author : ZHeng
 */
@SpringBootTest
public class RedisListTest01 {

//    @Autowired
//    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    public void test(){
        redisTemplate.opsForValue().set("user1",new User(2,"lisi",19));
        System.out.println(redisTemplate.opsForValue().get("user1"));
    }
}
ログイン後にコピー

実行すると、エラーが見つかります。 User オブジェクトがシリアル化されていないことを示すメッセージが表示されます。

org.springframework.data.redis.serializer.SerializationException: シリアル化できません。ネストされた例外は org.springframework.core.serializer.support.SerializationFailedException: DefaultSerializer を使用してオブジェクトをシリアル化できませんでした。ネストされた例外は Java です.lang.IllegalArgumentException: DefaultSerializer にはシリアル化可能なペイロードが必要ですが、タイプ [com.xxx.redis01.model.User]

.....
のオブジェクトを受け取りました。原因: java.lang.IllegalArgumentException: DefaultSerializer にはシリアル化可能なペイロードが必要ですが、org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
でタイプ [com.xxx.redis01.model.User]
のオブジェクトを受け取りました。 springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56)
org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60)
... 72 詳細


プロセスは終了コード -1 で終了しました。

User オブジェクトをシリアル化して実行すると、

public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    //省略getter setter toString等
}
ログイン後にコピー

なんと、文字化けしたコードはありません。 ! ですが、Linux を使用してリモート接続してキーを確認すると、あれ?ここが文字化けしています。 。 。

2022-04-01 20:32:07.666 情報 18640 --- [main] com.xxx.redis01.RedisListTest01 : アクティブなプロファイル セットがありません。1 つのデフォルト プロファイルにフォールバックします: "default"
2022-04-01 20:32:07.998 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate: 複数の Spring Data モジュールが見つかり、厳密なリポジトリ構成モードに入りました!
2022-04-01 20:32:08.000 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate: DEFAULT モードで Spring Data Redis リポジトリをブートストラップします。
2022-04-01 20:32:08.018 INFO 18640 --- [ main] .s.d.r.c.Repository ConfigurationDelegate : 完了した Spring Dataリポジトリ スキャン (5 ミリ秒) 0 件の Redis リポジトリ インターフェイスが見つかりました。
2022-04-01 20:32:08.752 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : RedisListTest01 を 1.488 秒で開始しました (JVM は 5 ミリ秒で実行されました) 2.51 7 )
User{id=2, name='lisi', age='19'}

プロセスは終了コード 0

で終了しましたこれは一体何ですか?これは明らかに user1 です。これは何ですか?

127.0.0.1:6379> keys *
¬쳵ser1
ログイン後にコピー

StringRedisTemplete の使用を検討してください。

解決策は決して 1 つではありません。参考までに、自分で調べて記録してください。

@SpringBootTest
public class RedisListTest01 {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Test
    public void test(){
        stringRedisTemplate.opsForValue().set("user1",new User(2,"lisi",19).toString());
        System.out.println(stringRedisTemplate.opsForValue().get("user1"));
    }
}
ログイン後にコピー

無事に取得できました

User{id=2, name='lisi', age='19'}
ログイン後にコピー

に移動します Linux で見てみましょう。同じでOKです

127.0.0.1:6379> keys *
user1
127.0.0.1:6379> get user1
User{id=2, name='lisi', age='19'}
127.0.0.1:6379>
ログイン後にコピー

もちろん、JSON 形式で保存する別の方法があるので、ここでは使用しませんここにコードを入れてください。

Redis の文字化け問題を解決します。

構成クラスを直接追加するだけです。

/**解决redis中文乱码
 * Created by dgx on 2019/8
 */
@Configuration
public class Config {

    @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate redisTemplateInit() {
        //设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}
ログイン後にコピー

以上がSpringBoot 統合 Redis に保存されたオブジェクトが文字化けする問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート