Я хочу сохранить пару ключ-значение в шаблоне Redis, используя Spring boot.Мой ключ имеет тип Long
, а значение на самом деле List<Object>
.Я пробую Redis впервые, и мне удалось сохранить нормальный формат <String, String>
.Но, пробуя вышеупомянутое <Long, List<Object>>
, я получил SerializationError
.Ниже приведен пример кода:
RedisConfig.java
@Bean
public RedisTemplate<Long, List<TransactionObject>> redisTemplate() {
final RedisTemplate<Long, List<TransactionObject>> template = new RedisTemplate<Long, List<TransactionObject>>();
template.setConnectionFactory(jedisConnectionFactory());
template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
return template;
}
RedisMessageRepository.java
@Repository
public class RedisMessageRepository {
private static final String KEY = "NEO4J";
private RedisTemplate<Long, List<TransactionObject>> redisTemplate;
private HashOperations hashOperations;
@Autowired
public RedisMessageRepository(RedisTemplate<Long, List<TransactionObject>> redisTemplate){
this.redisTemplate = redisTemplate;
}
@PostConstruct
private void init(){
hashOperations = redisTemplate.opsForHash();
}
public void add(final RedisMessage redisMessage) {
hashOperations.put(KEY, redisMessage.getId(), redisMessage.getName());
}
public void delete(final Long id) {
hashOperations.delete(KEY, id);
}
public RedisMessage findMessage(final Long id){
return (RedisMessage) hashOperations.get(KEY, id);
}
public Map<Long, List<TransactionObject>> findAllMessages(){
return hashOperations.entries(KEY);
}
}
RedisMessage.java:
public class RedisMessage implements Serializable {
private Long id;
private List<TransactionObject> txObj;
public RedisMessage(Long id, List<TransactionObject> txObj){
this.id=id;
this.txObj=txObj;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<TransactionObject> getName() {
return txObj;
}
public void setName(List<TransactionObject> txObj) {
this.txObj = txObj;
}
@Override
public String toString(){
return "RedisMessage{" + "id=" +id + '\'' + ", username =" + txObj.get(0).getUsername() + "}";
}
}
MessagePublisherImpl.java:
@Service
public class MessagePublisherImpl implements MessagePublisher {
@Autowired
private RedisTemplate<Long, List<TransactionObject>> redisTemplate;
@Autowired
private ChannelTopic topic;
public MessagePublisherImpl() {
}
public MessagePublisherImpl(final RedisTemplate<Long, List<TransactionObject>> redisTemplate, final ChannelTopic topic) {
this.redisTemplate = redisTemplate;
this.topic = topic;
}
@Override
public void publish(String message) {
redisTemplate.convertAndSend(topic.getTopic(), message);
}
}
И это ошибка, которую я получаю:
Servlet.service() for servlet [dispatcherServlet] in context with path []
threw exception [Request processing failed; nested exception is
org.springframework.data.redis.serializer.SerializationException: Cannot
serialize; nested exception is
org.springframework.core.serializer.support.SerializationFailedException: Failed
to serialize object using DefaultSerializer; nested exception is
java.io.NotSerializableException:
Я считаю, что проблема заключается в сериализации вышеуказанных типов.Я не уверен, как это сделать в формате, который я хочу.Кто-нибудь может предложить что-нибудь здесь?Кроме того, мне нужно было бы получить его обратно во время чтения из Redis.