実際、これは本質的には文字化けコードの一種ではなく、シリアル化後に保存されたものにすぎません。シリアル化されていない場合、エラーが報告され、シリアル化後に取得されたデータは必要なデータではありません。このメソッドを解決するには、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
解決策は決して 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中文乱码 * 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 サイトの他の関連記事を参照してください。