摘要:本文有部分代碼是抄襲的。第二個坑需要指定對象的數據類型,不然反序列化報錯。第三的編輯器非常不好用。上面的配置有個缺陷,就是只能指定數據類型去緩存到。其實還可以配置一個但我持久層是。查詢分頁結果時,會無法反序列化。搜了半天沒解決方案。
本文有部分代碼是抄襲的。
1 :引入依賴org.springframework.data spring-data-redis ${spring-data-redis.version} org.apache.commons commons-pool2 ${commons-pool2.version} biz.paluch.redis lettuce ${lettuce.version}
/** * 配置緩存 */
@EnableCaching
public class CachingConfig extends CachingConfigurerSupport {
@Resource(name = "redisTemplate") private RedisTemplate
}
配置redis
public class RedisConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(RedisConfig.class); private String host = "localhost"; private int port = 6379; private String password = "redis"; private int database = 0; /** * 使用這個連接池,需要commons-pool2依賴 * lettuce其實沒有必要使用連接池 https://github.com/lettuce-io/lettuce-core/wiki/Connection-Pooling * * @return */ @Bean(value = "lettucePool") public LettucePool lettucePool() { DefaultLettucePool pool = new DefaultLettucePool(); pool.setDatabase(0); pool.setHostName("localhost"); pool.setPort(6379); //調用這個方法,確保連接池被初始化 pool.afterPropertiesSet(); return pool; } /** * 設置 redis連接工廠,通過連接池的方式來初始化工廠 * * @return */ //@Lazy(value = false) @Bean(name = "redisConnectionFactory") @DependsOn(value = "lettucePool") public RedisConnectionFactory redisConnectionFactory() { //Linux使用這種方式初始化工廠 //return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock")); LettuceConnectionFactory factory = new LettuceConnectionFactory(lettucePool()); //如果不使用連接池初始化工廠,則需要調用這個方法 //factory.afterPropertiesSet(); return factory; } /** * 設置redis操作模板 * * @param redisConnectionFactory * @return */ @Bean(name = "redisTemplate") @DependsOn(value = "redisConnectionFactory") public RedisTemplate
}
設置序列化
public class SerializerConfig {
/** * 配置 jackson mapper * @return */ @Lazy(value = false) @Bean(name = "jacksonMapper") public ObjectMapper jacksonMapper(){ ObjectMapper mapper=new ObjectMapper(); //只針對非空的值進行序列化 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 去掉各種@JsonSerialize注解的解析 //mapper.configure(MapperFeature.USE_ANNOTATIONS, false); // 將類型序列化到屬性json字符串中 有的文章說需要這個才能正確反序列化 //mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); // 對于找不到匹配屬性的時候忽略報錯 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 不包含任何屬性的bean也不報錯 mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); return mapper; } /** * 關鍵 * Jackson2JsonRedisSerializer 是泛型,需要指定類型 * 這樣才能正確反序列化,不然會拋出 java.util.LinkedHashMap cannot be cast YOUR OBJECT 異常 * @return */ @Lazy(value = false) @Bean(name = "jackson2JsonRedisSerializer") public Jackson2JsonRedisSerializerjackson2JsonRedisSerializer(){ Jackson2JsonRedisSerializer jsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Response.class); jsonRedisSerializer.setObjectMapper(jacksonMapper()); return jsonRedisSerializer; } @Lazy(value =false) @Bean (name = "stringRedisSerializer") public StringRedisSerializer stringRedisSerializer(){ return new StringRedisSerializer(StandardCharsets.UTF_8); }
}
最后在需要的地方開啟注解緩存即可
@CacheConfig(cacheManager = "redisCache",cacheNames = {"bxe"})
@Cacheable
弄這個破玩意好幾天,尤其是spring data redis還挑lettuce的版本,我把git的源碼下載一遍自己編譯都報錯,最后才發現是版本問題。
第二個坑:RedisSerializer需要指定對象的數據類型,不然反序列化報錯。
第三: segmentfault的編輯器非常不好用。
--------update
上面的配置有個缺陷,就是只能指定數據類型去緩存到redis。
其實還可以配置一個GenericJackson2JsonRedisSerializer
@Bean(name = "jsonRedisSerializer") public GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer(){ GenericJackson2JsonRedisSerializer jsonRedisSerializer=new GenericJackson2JsonRedisSerializer(“@class); return jsonRedisSerializer; } 但我持久層是 Spring data JPA。 查詢分頁結果時,會無法反序列化。 Could not read JSON: Cannot construct instance of `org.springframework.data.domain.PageImpl` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
搜了半天沒解決方案。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76108.html
摘要:創建工程將框架代碼包解壓后放到工作目錄。方便起見,本教程使用為例。添加創建一個,負責響應相關的業務請求。添加標注在中,對輸入參數進行校驗通常使用標注。在本教程,我們將實現的增和查的工作。創建用戶用戶名重啟并提交創建請求。 環境準備 系統:MacOS 開發:IntelliJ IDEA 語言:Java8 其它:Mysql、Redis 腳手架代碼 Spring提供了一個創建項目腳手架的官...
閱讀 2894·2021-11-24 09:38
閱讀 3518·2021-11-23 09:51
閱讀 987·2021-09-09 11:52
閱讀 4039·2021-08-11 11:18
閱讀 1115·2019-08-30 14:05
閱讀 3235·2019-08-30 11:23
閱讀 1773·2019-08-29 17:02
閱讀 1132·2019-08-26 13:49