序文
SpringBootは非常に便利なJava開発フレームワークですが、実際の開発過程では必ずいくつかの問題に遭遇します。ここではSpringBootを利用する際にRedisにオブジェクトを格納すると文字化けしてしまう問題を紹介し、具体的な解決策を解説します。
問題の背景
SpringBoot を使用して Redis に接続する場合、通常は RedisTemplate を使用して操作することを選択します。ただし、RedisTemplate を使用して Redis にクラスを格納すると、次のように文字化けが発生することがあります。
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unexpected character (�) at position 0.
このエラー メッセージは、RedisTemplate が JSON 形式のオブジェクトを解析できず、最初の文字位置に予期しない文字 (つまり、文字化け) が表示されていることを示しています。
問題分析
慎重に調査した結果、この問題の原因は、RedisTemplate がデフォルトでシリアル化に JdkSerializationRedisSerializer を使用しており、JdkSerializationRedisSerializer がオブジェクトをバイト ストリームにシリアル化するため、データを取り出した後に正常に解析することが不可能であることがわかりました。
解決
解決策 1: シリアライザーを交換する
この問題を解決するには、RedisTemplate のシリアライザーを置き換えます。SpringBoot では、application.yml ファイルを変更することで構成できます。
spring:
redis:
host: localhost
port: 6379
password:
timeout: 10000
lettuce:
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
shutdown-timeout: 3000
# 更换序列化器
keySerializer: org.springframework.data.redis.serializer.StringRedisSerializer
valueSerializer: org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
ここでは、keySerializer と valueSerializer の両方を StringRedisSerializer と GenericJackson2JsonRedisSerializer に置き換えます。
解決策 2: 保存方法を変更する
シリアライザーの方法を変更することに加えて、ストレージの方法を変更することも選択できます。たとえば、オブジェクトを Redis に直接保存するのではなく、JSON 形式に変換して保存します。サンプルコードは次のとおりです。
@Autowired
private RedisTemplate redisTemplate;
public void setObject(String key, Object value) {
// 将对象转换成JSON字符串
String jsonString = JSON.toJSONString(value);
redisTemplate.opsForValue().set(key, jsonString);
}
public Object getObject(String key) {
String value = (String) redisTemplate.opsForValue().get(key);
// 将JSON字符串转换成对象
return JSON.parseObject(value, Object.class);
}
このようにして、Redis にオブジェクトを正しく保存し、必要なときにスムーズに取り出すことができます。
結論
以上、SpringBootにおけるRedis接続プールのストレージオブジェクトの文字化け問題を解決するチュートリアルでしたので、実際の開発で同様の問題に遭遇した際の参考になれば幸いです。