Как сохранить значение типа List <Object>в Redis с помощью Spring boot? - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу сохранить пару ключ-значение в шаблоне 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.

1 Ответ

0 голосов
/ 10 декабря 2018

RedisTemplate OpsForHash принимает ключ в качестве экземпляра байта [].

Попробуйте преобразовать переменные ключа и значения в тип String.

...