Мы пытаемся использовать Spring Data CrudRepository
в нашем проекте, чтобы обеспечить постоянство для наших объектов домена.
Для начала я выбрал 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'
}
RedisConfiguration:
@Configuration
@EnableRedisRepositories
public class RedisConfiguration {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
final RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setDefaultSerializer(jackson2JsonRedisSerializer);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setEnableDefaultSerializer(true);
return template;
}
}
TestObject
@RedisHash("test")
public class TestObject
{
@Id public ObjectId testId;
public String value;
public TestObject(ObjectId id, String value)
{
this.testId = id;
this.value = value; // In experiment this is: "magic"
}
}
ObjectId
@EqualsAndHashCode
public class ObjectId {
public String creator; // In experiment, this is "me"
public String name; // In experiment, this is "fool"
}
TestRepository
@Repository
public interface TestRepository extends CrudRepository<TestObject, ObjectId>
{
}
EmbeddedRedisConfiguration
@Configuration
public class EmbeddedRedisConfiguration
{
private final redis.embedded.RedisServer redisServer;
EmbeddedRedisConfiguration(RedisProperties redisProperties)
{
this.redisServer = new redis.embedded.RedisServer(redisProperties.getPort());
}
@PostConstruct
public void init()
{
redisServer.start();
}
@PreDestroy
public void shutdown()
{
redisServer.stop();
}
}
Применение:
@SpringBootApplication
public class ExperimentApplication
{
public static void main(String[] args)
{
SpringApplication.run(ExperimentApplication.class, args);
}
}
Не тот ответ:
Конечно, я мог бы ввести специальный идентификатор, который представляет собой простой тип данных, например JSON-String, который я создаю вручную с помощью jacksons ObjectMapper, а затем использую CrudRepository<TestObject, String>
.
Что я тем временем пробовал:
RedisTemplate<String, String>
RedisTemplate<String, Object>
- Автоматическое подключение
RedisTemplate
и установка его сериализатора по умолчанию - Registering a
Converter<ObjectId, byte[]>
to- An autowired
ConverterRegistry
GenericConversionService
с автоматическим подключением, но, видимо, они ошиблись.
- An autowired