spring-boot - 带有 JSON 转换器的 Spring Data Redis 给出“属性路径不能为空或空”。
问题描述
我正在尝试将 CrudRepository 与 spring-data-redis 和生菜结合使用。按照我能找到的所有建议,我已经使用@ReadingConverters 和@WritingConverters 配置了我的spring-boot 2.1.8 应用程序,但是当我尝试使用存储库时,我得到“属性路径不能为空或空”。
做一些调试,这似乎是由org.springframework.data.redis.core.convert.MappingRedisConverter:393
writeInternal(entity.getKeySpace(), "", source, entity.getTypeInformation(), sink);
第二个参数是路径。MappingRedisConverter
这将在运行此代码的第 747 行结束:
} else if (targetType.filter(it -> ClassUtils.isAssignable(byte[].class, it)).isPresent()) {
sink.getBucket().put(path, toBytes(value));
}
最终,即使数据已被序列化,具有空路径的 put 最终也会org.springframework.data.redis.core.convert.Bucket:77
失败。Assert.hasText(path, "Path to property must not be null or empty.");
这是 spring-data-redis 的错误还是我必须配置其他东西?
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);
}
}
我刚刚在这里包含了一个写作转换器,但有几个读写转换器......
@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;
}
}
要写的对象:
@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;
}
和回购:
public interface CategoryRepository extends CrudRepository<Category, String> {
Page<Category> findAll(Pageable pageable);
}
任何人都可以建议我错过了什么,或者如果这是我应该在 spring-data-redis 上提出的错误?
解决方案
推荐阅读
- sql - Oracle/PL-SQl:将查询结果传递给另一个更新
- java - java语言中的字符串与字符串?
- python - 在 Windows 10 中双击运行 .py 文件
- stripe-payments - 如何在结帐前检查 Stripe 促销代码是否对产品有效
- jenkins-pipeline - odoo psycopg2.ProgrammingError:列 res_partner.field_name 不存在
- python-3.x - Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据
- mysql - 我如何从大 mysql 表中获取每天的最后一行
- php - 为学校项目设置 SSO shibolleth
- python - 将数组转换为数据框列
- ios - iOS 14 解决方法中的 SceneKit Metal 着色器编译性能错误