spring Boot 應用中 redis 緩存 OAuth2Authorization 對象及序列化問題解決方案
本文介紹如何在 spring boot 應用中利用 redis 緩存 OAuth2Authorization 對象,并解決其序列化過程中可能遇到的問題。
問題:
在 Spring Boot 3.1.0 版本中,使用 spring-boot-starter-oauth2-authorization-server 依賴和自定義的 RedisTemplate 配置(基于 Jackson 序列化),嘗試緩存 OAuth2Authorization 對象時,可能會出現序列化失敗。原因是 OAuth2Authorization 對象的 AuthorizationGrantType 屬性缺少無參構造函數,導致 Jackson 無法序列化。 直接使用 RedisSerializer.Java() 雖然能解決序列化問題,但會降低可讀性,不利于調試。
解決方案:
通過 Jackson 的 @jsonCreator 注解和 Mixin 機制,為 AuthorizationGrantType 添加一個無參構造函數。 以下代碼片段演示了如何創建一個 Mixin 類 AuthorizationGrantTypeMixin 并將其注冊到 ObjectMapper:
public abstract class AuthorizationGrantTypeMixin { @JsonCreator public AuthorizationGrantTypeMixin(@JsonProperty("value") String value) { } } ObjectMapper objectMapper = new ObjectMapper(); objectMapper.addMixIn(AuthorizationGrantType.class, AuthorizationGrantTypeMixin.class); RedisSerializer<Object> serializer = new GenericJackson2JsonRedisSerializer(objectMapper); template.setDefaultSerializer(serializer);
代碼解釋:
我們創建了一個 AuthorizationGrantTypeMixin 類,使用 @JsonCreator 和 @JsonProperty 注解為 AuthorizationGrantType 類添加了一個接收 “value” 屬性的構造函數。 然后,將這個 Mixin 類注冊到 ObjectMapper 中,使 Jackson 在序列化 AuthorizationGrantType 對象時使用這個自定義構造函數。 最后,將自定義的 ObjectMapper 應用于 GenericJackson2JsonRedisSerializer,并將其設置為 RedisTemplate 的默認序列化器。 這樣既解決了缺少無參構造函數的問題,又保留了 Jackson 的 JSON 序列化能力,方便調試和查看緩存數據。