【问题标题】:Spring Data Redis: Failed to convert from type [org.springframework.data.redis.connection.stream.StreamRecords$ByteMapBackedRecord] to typeSpring Data Redis:无法从类型 [org.springframework.data.redis.connection.stream.StreamRecords$ByteMapBackedRecord] 转换为类型
【发布时间】:2022-01-20 23:08:36
【问题描述】:

当我尝试将消息从 Stream 转换为我的实体时,我一直在努力解决 Spring Redis Streams 的这个异常。我认为这是由于 Redis Stream 的默认反序列化器的问题而发生的,但不知道如何解决。

当我将此消息发送到 Redis 流时

XADD my-stream * from john to smith type Request

我从我的 Spring Boot 服务中得到了这个异常

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [org.springframework.data.redis.connection.stream.StreamRecords$ByteMapBackedRecord] to type [com.example.messaging.Dto.NotificationMessage] for value 'MapBackedRecord{recordId=1639826917707-0, kvMap={[B@55ab97aa=[B@510458ff, [B@5b7e99c1=[B@4141b49e, [B@12840469=[B@6aa14d0}}'; nested exception is java.lang.IllegalArgumentException: Value must not be null!
    at org.springframework.data.redis.stream.StreamPollTask.convertRecord(StreamPollTask.java:198) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.stream.StreamPollTask.deserializeAndEmitRecords(StreamPollTask.java:176) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.stream.StreamPollTask.doLoop(StreamPollTask.java:148) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.stream.StreamPollTask.run(StreamPollTask.java:132) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.lang.IllegalArgumentException: Value must not be null!
    at org.springframework.util.Assert.notNull(Assert.java:201) ~[spring-core-5.3.12.jar:5.3.12]
    at org.springframework.data.redis.connection.stream.Record.of(Record.java:81) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.connection.stream.MapRecord.toObjectRecord(MapRecord.java:147) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.core.StreamObjectMapper.toObjectRecord(StreamObjectMapper.java:138) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.core.StreamOperations.map(StreamOperations.java:577) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.stream.DefaultStreamMessageListenerContainer.lambda$getDeserializer$2(DefaultStreamMessageListenerContainer.java:240) ~[spring-data-redis-2.5.6.jar:2.5.6]
    at org.springframework.data.redis.stream.StreamPollTask.convertRecord(StreamPollTask.java:196) ~[spring-data-redis-2.5.6.jar:2.5.6]
    ... 4 common frames omitted

配置类:

@Configuration
public class RedisConfig {

    @Autowired
    private StreamListener<String, ObjectRecord<String, NotificationMessage>> streamListener;

    @Bean
    public Subscription subscription(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, NotificationMessage>> options
                = StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()
                .pollTimeout(Duration.ofMillis(1000))
                .targetType(NotificationMessage.class)
                .build();

        StreamMessageListenerContainer<String, ObjectRecord<String, NotificationMessage>> listenerContainer =
                StreamMessageListenerContainer.create(redisConnectionFactory, options);

        Subscription subscription = listenerContainer.receive(StreamOffset.latest("my-stream"), streamListener);

        listenerContainer.start();
        return subscription;
    }
}

NotificationMessage Dto:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NotificationMessage {
    private String id;
    private String from;
    private String to;
    private String type;
}

【问题讨论】:

  • 我也面临这个问题,你有没有机会解决它?

标签: java spring spring-boot redis deserialization


【解决方案1】:

所以我遇到了同样的问题,我有一些消息从一个服务序列化到 redis 并在另一个服务中反序列化,它会抱怨它无法转换类型,即使对象是相同的,除了类路径。我必须为我的 redis 侦听器提供具有来自源服务的确切类路径的模型,它才能工作。

这里有人在使用 typealias 尝试解决同样的问题时遇到了问题: https://github.com/spring-projects/spring-data-redis/issues/1095

我仍在尝试找到一个更优雅的解决方案,可能在我的案例中使用 typealias 注释。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 2021-03-04
  • 2020-04-23
  • 2020-03-29
  • 1970-01-01
  • 2018-11-02
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多