第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

具有復(fù)雜密鑰的 SpringData Redis 存儲(chǔ)庫

具有復(fù)雜密鑰的 SpringData Redis 存儲(chǔ)庫

慕森卡 2024-01-05 14:40:29
CrudRepository我們嘗試在項(xiàng)目中使用 Spring Data來為域?qū)ο筇峁┏志眯?。首先,我選擇 REDIS 作為后端,因?yàn)樵诘谝淮螌?shí)驗(yàn)中CrudRepository<ExperimentDomainObject, String>,它的運(yùn)行似乎很容易。當(dāng)嘗試將其放入我們的生產(chǎn)代碼中時(shí),事情變得更加復(fù)雜,因?yàn)檫@里我們的域?qū)ο蟛恍枰褂煤唵晤愋妥鳛槊荑€,因此存儲(chǔ)庫是CrudRepository<TestObject, ObjectId>.現(xiàn)在我得到了例外:找不到能夠從類型 [...ObjectId] 轉(zhuǎn)換為類型 [byte[]] 的轉(zhuǎn)換器尋找這個(gè)異常,這個(gè)答案導(dǎo)致我對(duì)RedisTemplate配置進(jìn)行了未經(jīng)教育的實(shí)驗(yàn)。(對(duì)于我的實(shí)驗(yàn),我使用的是 emdedded-redis)我的想法是,提供一個(gè)RedisTemplate<Object, Object>而不是RedisTemplate<String, Object>允許使用Jackson2JsonRedisSerializerkeySerializer 來完成工作。盡管如此,調(diào)用還是testRepository.save(testObject)失敗。請看我的代碼:為了簡潔起見,我有公共字段并省略了導(dǎo)入。如果需要它們(使其成為 MVCE),我將很樂意提供它們。請給我留言。依賴項(xiàng):dependencies {    implementation 'org.springframework.boot:spring-boot-starter-data-redis'    implementation 'org.springframework.boot:spring-boot-starter-web'    compileOnly 'org.projectlombok:lombok'    annotationProcessor 'org.projectlombok:lombok'    implementation group: 'redis.clients', name: "jedis", version: '2.9.0'    implementation group: 'it.ozimov', name: 'embedded-redis', version: '0.7.2'}Redis配置:@Configuration@EnableRedisRepositoriespublic class RedisConfiguration {    @Bean    JedisConnectionFactory jedisConnectionFactory() {        return new JedisConnectionFactory();    }}不是想要的答案:當(dāng)然,我可能會(huì)引入一些特殊的 ID,它是一種簡單的數(shù)據(jù)類型,例如我使用 jacksons ObjectMapper 手動(dòng)構(gòu)建的 JSON-String,然后使用CrudRepository<TestObject, String>.同時(shí)我也嘗試過:RedisTemplate<String, String>RedisTemplate<String, Object>自動(dòng)裝配 aRedisTemplate并設(shè)置其默認(rèn)序列化器注冊一個(gè)Converter<ObjectId, byte[]>到自動(dòng)裝配的ConverterRegistry一個(gè)自動(dòng)接線GenericConversionService,但顯然他們是錯(cuò)誤的。
查看完整描述

1 回答

?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

基本上,Redis 存儲(chǔ)庫使用RedisKeyValueTemplate底層將數(shù)據(jù)存儲(chǔ)為鍵(Id)和值對(duì)。所以除非你直接使用它,否則你的配置RedisTemplate將不起作用。


因此,您的一種方法是RedistTemplate直接使用,這樣的東西對(duì)您有用。


@Service

public class TestService {


    @Autowired

    private RedisTemplate redisTemplate;


    public void saveIt(TestObject testObject){

        ValueOperations<ObjectId, TestObject> values = redisTemplate.opsForValue();

        values.set(testObject.testId, testObject);

    }


}

因此,上面的代碼將使用您的配置并使用 Jackson 作為鍵和值的映射器在 Redis 中生成字符串對(duì)。


但是,如果您想通過以下方式使用 Redis 存儲(chǔ)庫,則需要為from 和 toCrudRepository創(chuàng)建讀寫轉(zhuǎn)換器,并將它們注冊為自定義 Redis 轉(zhuǎn)換。ObjectIdStringbyte[]


ObjectId因此,讓我們?yōu)?lt;->創(chuàng)建讀寫轉(zhuǎn)換器String


讀者


@Component

@ReadingConverter

@Slf4j

public class RedisReadingStringConverter implements Converter<String, ObjectId> {


    private ObjectMapper objectMapper = new ObjectMapper();


    @Override

    public ObjectId convert(String source) {

        try {

            return objectMapper.readValue(source, ObjectId.class);

        } catch (IOException e) {

            log.warn("Error while converting to ObjectId.", e);

            throw new IllegalArgumentException("Can not convert to ObjectId");

        }

    }

}

作家


@Component

@WritingConverter

@Slf4j

public class RedisWritingStringConverter implements Converter<ObjectId, String> {


    private ObjectMapper objectMapper = new ObjectMapper();


    @Override

    public String convert(ObjectId source) {

        try {

            return objectMapper.writeValueAsString(source);

        } catch (JsonProcessingException e) {

            log.warn("Error while converting ObjectId to String.", e);

            throw new IllegalArgumentException("Can not convert ObjectId to String");

        }

    }

}

以及 ObjectId <-> byte[] 的讀寫轉(zhuǎn)換器


作家


@Component

@WritingConverter

public class RedisWritingByteConverter implements Converter<ObjectId, byte[]> {


    Jackson2JsonRedisSerializer<ObjectId> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(ObjectId.class);


    @Override

    public byte[] convert(ObjectId source) {

        return jackson2JsonRedisSerializer.serialize(source);

    }

}

讀者


@Component

@ReadingConverter

public class RedisReadingByteConverter implements Converter<byte[], ObjectId> {


     Jackson2JsonRedisSerializer<ObjectId> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(ObjectId.class);


    @Override

    public ObjectId convert(byte[] source) {

        return jackson2JsonRedisSerializer.deserialize(source);

    }

}

最后添加 Redis 自定義對(duì)話。只需將代碼放入RedisConfiguration


@Bean

public RedisCustomConversions redisCustomConversions(RedisReadingByteConverter readingConverter,

                                                     RedisWritingByteConverter redisWritingConverter,

                                                     RedisWritingStringConverter redisWritingByteConverter,

                                                     RedisReadingStringConverter redisReadingByteConverter) {

    return new RedisCustomConversions(Arrays.asList(readingConverter, redisWritingConverter, redisWritingByteConverter, redisReadingByteConverter));

}

因此,現(xiàn)在在創(chuàng)建轉(zhuǎn)換器并將其注冊為自定義 Redis 轉(zhuǎn)換器后,您RedisKeyValueTemplate可以使用它們,并且您的代碼應(yīng)該按預(yù)期工作。


查看完整回答
反對(duì) 回復(fù) 2024-01-05
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)