当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Redis将POJO列表存储为值

彭霄
2023-03-14
@Configuration
@EnableCaching
@Slf4j
public class RedisCacheConfig extends CachingConfigurerSupport {

private static final long DEFAULT_CACHE_EXPIRES = 60;

@Bean
public RedisTemplate<String, Object> redisTemplate(final RedisConnectionFactory redisConnectionFactory) {
    final RedisTemplate<String, Object> template = new RedisTemplate<>();
    setRedisTemplateConfigValues(redisConnectionFactory, template);
    return template;
}

@Bean
public CacheManager cacheManager(final RedisConnectionFactory redisConnectionFactory) {
    Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();

    return RedisCacheManager
            .builder(redisConnectionFactory)
            .cacheDefaults(createCacheConfiguration())
            .withInitialCacheConfigurations(cacheConfigurations).build();
}

private static RedisCacheConfiguration createCacheConfiguration() {
    return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofSeconds(DEFAULT_CACHE_EXPIRES));
}

private <T> void setRedisTemplateConfigValues(final RedisConnectionFactory redisConnectionFactory,
                                              final RedisTemplate<String, T> template) {

    template.setConnectionFactory(redisConnectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
}
}
1) "schools::ABC"

现在针对ABC键的值应该是复杂对象的列表。但当我真的得到“学校::abc”

我用奇怪的字符得到的值如下:

\xac\xed\x00\x05SR\x00\x13java.util.arraylistx\x81\xD2\x1D\x99\xC7A\x9D\x03\x00\x01I\x00\x04Sizexp\x00\x00\x00\x01W\x04\x00\x00\x00\x01SR\x00(com.example.等等)

另外,我尝试将valueSerializer配置中的GenericJackson2JsonRedisSerializer更新为Jackson2JsonRedisSerializer。结果没有什么不同。

另外,我尝试获取键的类型,我得到的结果是'string',所以列表被存储为string。

共有1个答案

孟永望
2023-03-14

您之所以看到那些奇怪的字符,是因为它是二进制数据。

您将GenericJackson2JsonRedisSerializer配置为值的序列化程序。该类在内部调用ObjectMapper#WriteValueasBytes(...)顾名思义,它将输入的值转换为字节。

这是意料之中的。Redis不直接支持存储Java对象。但是,它确实支持存储二进制数据。通过使用Jackson,我们可以将Java对象转换为字节,并将其存储在Redis中。当然,反之亦然。

 类似资料:
  • 我有问题将列表字段存储为cassandra数据库中我的表的字段。 我使用的是spring-数据-卡桑德拉,版本1.4.1,发布版。 我的模型包含: 我想用SchemaAction自动创建我的db表。配置类中的recreate_drop_unused架构操作: 它尝试创建表,但发生以下异常:

  • 当返回类型为时,我创建了一个REST服务,该服务可以正常工作,但当我指定时,我会收到以下错误消息: 找不到应用程序的messagewriter=json/bodytype=json。util。ArrayList,genericType=java。util。列表 我已经尝试过了:添加jersey media jackson和jersey jackson moxy,但没有成功。 环境:我使用Glass

  • 问题内容: 如何转换 这是例子 有没有简单的方法可以做到这一点?什么库在这里有用? 谢谢。 问题答案: 也许http://dozer.sourceforge.net可以为您提供帮助。它是可通过xml配置的映射库。 我很快尝试了这个: 我的mappings.xml看起来像这样: 不幸的是,它仅将10映射到所有三个PojoObject属性。也许您可以看到错误并使用代码段。也许这是Dozer中的一个错误

  • 我有一个POJO类,它将从JSON反序列化,JSON在Spring中作为请求体出现。此POJO类包含列表 我的JSON对象如下所示 下面是示例方法调用 我遵循了给出的建议,下面给出了反序列化程序代码

  • 问题内容: 我必须将我们的j2ee应用程序与REST Web服务集成在一起。我想使用JBoss的RestEasy JAX- RS实现。Web服务返回JSON格式的数组。我有这段代码: 我可以将此“响应”对象映射到使用RestEasy吗?谢谢 问题答案: 如果您的JSON提供程序能够转换为适当的实体,那么可以。您在代码中调用的方法具有重载的版本,该版本接受将结果转换为的实体类。由于序列化某些集合的实

  • 2.如果用户在excel表格中复制,则应易于复制,即使用户试图在记事本中复制,也应以表格格式打印。 3.添加一些元数据到剪贴板,以确定pojo何时我们将再次导入表。 为了将pojo列表转换为表格格式,我使用了jtable,但无法将所有jtable内容导出到剪贴板。 --pojo.java 当我试图将字符串值复制到剪贴板时,它是工作的,但当我试图复制pojo时,它是不工作的。