Skip to content

StreamOperations.map(…) does not retain target type hint #2198

Closed
@huan1993

Description

@huan1993

description

Today, when I read a message of type ObjectRecord from Redis Stream, the following exception occurred. I don't know how to solve it.

error info

2021-11-10 14:05:11.457  INFO 8754 --- [           main] c.h.study.redis.RedisStreamApplication   : Started RedisStreamApplication in 2.598 seconds (JVM running for 3.399)
2021-11-10 14:05:11.566  INFO 8754 --- [           main] c.h.s.r.stream.producer.StreamProducer   : generator book info :[Book(title=Time To Murder And Create, author=Vito Denesik)]
2021-11-10 14:05:11.662  INFO 8754 --- [           main] c.h.s.r.stream.producer.StreamProducer   : return record-id:[1636524311682-0]
Exception in thread "xread-nonblock-02" java.lang.IllegalArgumentException: Value must not be null!
	at org.springframework.util.Assert.notNull(Assert.java:201)
	at org.springframework.data.redis.connection.stream.Record.of(Record.java:81)
	at org.springframework.data.redis.connection.stream.MapRecord.toObjectRecord(MapRecord.java:147)
	at org.springframework.data.redis.core.StreamObjectMapper.toObjectRecord(StreamObjectMapper.java:138)
	at org.springframework.data.redis.core.StreamObjectMapper.toObjectRecords(StreamObjectMapper.java:164)
	at org.springframework.data.redis.core.StreamOperations.map(StreamOperations.java:594)
	at org.springframework.data.redis.core.StreamOperations.read(StreamOperations.java:413)
	at com.huan.study.redis.stream.consumer.xread.XreadNonBlockConsumer02.lambda$afterPropertiesSet$1(XreadNonBlockConsumer02.java:62)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

core code

spring data stream error

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
    return redisTemplate;
}

The code is very easy, that is, the producer generates an ObjectRecord type message, and then the consumer consumes the message.

The following is a complete example to reproduce this problem

https://github.com/huan1993/spring-data-redis-stream

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions