CrudRepository
我们尝试在项目中使用 Spring Data来为域对象提供持久性。
首先,我选择 REDIS 作为后端,因为在第一次实验中CrudRepository<ExperimentDomainObject, String>
,它的运行似乎很容易。
当尝试将其放入我们的生产代码中时,事情变得更加复杂,因为这里我们的域对象不需要使用简单类型作为密钥,因此存储库是CrudRepository<TestObject, ObjectId>
.
现在我得到了例外:
找不到能够从类型 [...ObjectId] 转换为类型 [byte[]] 的转换器
寻找这个异常,这个答案导致我对RedisTemplate
配置进行了未经教育的实验。(对于我的实验,我使用的是 emdedded-redis)
我的想法是,提供一个RedisTemplate<Object, Object>
而不是RedisTemplate<String, Object>
允许使用Jackson2JsonRedisSerializer
keySerializer 来完成工作。
尽管如此,调用还是testRepository.save(testObject)
失败。
请看我的代码:
为了简洁起见,我有公共字段并省略了导入。如果需要它们(使其成为 MVCE),我将很乐意提供它们。请给我留言。
依赖项:
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
@EnableRedisRepositories
public class RedisConfiguration {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
}
当然,我可能会引入一些特殊的 ID,它是一种简单的数据类型,例如我使用 jacksons ObjectMapper 手动构建的 JSON-String,然后使用CrudRepository<TestObject, String>
.
RedisTemplate<String, String>
RedisTemplate<String, Object>
自动装配 aRedisTemplate
并设置其默认序列化器
注册一个Converter<ObjectId, byte[]>
到
自动装配的ConverterRegistry
一个自动接线GenericConversionService
,但显然他们是错误的。
皈依舞
相关分类