4

I am trying to use a CrudRepository in association with spring-data-redis and lettuce. Following all the advice I can find I have configured my spring-boot 2.1.8 application with @ReadingConverters and @WritingConverters but when I try to use the repository I am getting "Path to property must not be null or empty."

Doing some debugging, this seems to be caused by org.springframework.data.redis.core.convert.MappingRedisConverter:393

writeInternal(entity.getKeySpace(), "", source, entity.getTypeInformation(), sink);

The second parameter being the path. This ends up at line 747 of MappingRedisConverter running this code:

} else if (targetType.filter(it -> ClassUtils.isAssignable(byte[].class, it)).isPresent()) {
            sink.getBucket().put(path, toBytes(value));
}

Ultimately, the put with an empty path ends up in org.springframework.data.redis.core.convert.Bucket:77 and fails the Assert.hasText(path, "Path to property must not be null or empty."); even though the data has been serialized.

Is this a bug with spring-data-redis or have I got to configure something else?

RedicsConfig.java

@Configuration
@EnableConfigurationProperties({RedisProperties.class})
@RequiredArgsConstructor
@EnableRedisRepositories
public class RedisConfiguration {
    private final RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
        template.setConnectionFactory(redisConnectionFactory);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.findAndRegisterModules();
        return objectMapper;
    }

    @Bean
    public RedisCustomConversions redisCustomConversions(List<Converter<?,?>> converters) {
        return new RedisCustomConversions(converters);
    }

}

I've just included one writing converter here but have several reading and writing ones...


@Component
@WritingConverter
@RequiredArgsConstructor
@Slf4j
public class CategoryWritingConverter implements Converter<Category, byte[]> {

    private final ObjectMapper objectMapper;

    @Setter
    private Jackson2JsonRedisSerializer<Category> serializer;

    @Override
    public byte[] convert(Category category) {
        return getSerializer().serialize(category);
    }

    private Jackson2JsonRedisSerializer<Category> getSerializer() {
        if (serializer == null) {
            serializer = new Jackson2JsonRedisSerializer<>(Category.class);
            serializer.setObjectMapper(objectMapper);
        }
        return serializer;
    }
}

The object to write:

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("category")
@TypeAlias("category")
public class Category {

    @Id
    @EqualsAndHashCode.Include
    private String categoryCode;

    private String categoryText;
}

And the repo:


public interface CategoryRepository extends CrudRepository<Category, String> {

    Page<Category> findAll(Pageable pageable);

}

Can anybody advise what I have missed or if this is a bug I should raise on spring-data-redis?

theINtoy
  • 3,388
  • 2
  • 37
  • 60
  • 1
    I think this issue explains https://jira.spring.io/projects/DATAREDIS/issues/DATAREDIS-911?filter=allissues – acemrek Feb 14 '20 at 05:43
  • Did you get any solution for this? I tried updating versions, its still failing. – shan Apr 22 '21 at 23:16

0 Answers0