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

spring数据redis-Jackson序列化

呼延明朗
2023-03-14

我正在尝试使用spring data redis的Jackson序列化功能。我正在构建一个ObjectMapper,并使用GenericJackson2JsonRedisSerializer作为redisTemplate的序列化程序:



    @Configuration
    public class SampleModule {
        @Bean
        public ObjectMapper objectMapper() {
            return Jackson2ObjectMapperBuilder.json()
                    .serializationInclusion(JsonInclude.Include.NON_NULL) // Don’t include null values
                    .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) //ISODate
                    .build();
        }

        @Bean
        public RedisTemplate getRedisTemplate(ObjectMapper objectMapper, RedisConnectionFactory redisConnectionFactory){
            RedisTemplate redisTemplate = new RedisTemplate();
            redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            return redisTemplate;
        }
    }

我正试图保存一个样本bean:



    @RedisHash("sampleBean")
    public class SampleBean {
        @Id
        String id;
        String value;
        Date date;

        public SampleBean(String value, Date date) {
            this.value = value;
            this.date = date;
        }
    } 

以及该bean的存储库:



    public interface SampleBeanRepository extends CrudRepository {
    }

然后我尝试将bean写入Redis:



    ConfigurableApplicationContext context =    SpringApplication.run(SampleRedisApplication.class, args);

    SampleBean helloSampleBean = new SampleBean("hello", new Date());
    ObjectMapper objectMapper = context.getBean(ObjectMapper.class);
    logger.info("Expecting date to be written as: " + objectMapper.writeValueAsString(helloSampleBean.date));

    SampleBeanRepository repository = context.getBean(SampleBeanRepository.class);
    repository.save(helloSampleBean);

    context.close();

我希望redisTemplate使用序列化程序将SampleBean内的日期作为时间戳写入,但它是长的。

相关spring-data-redis参考:http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:序列化程序完整代码示例:https://github.com/bandyguy/spring-redis-jackson-sample-broken

共有1个答案

严亮
2023-03-14

模板使用的序列化器/映射器不影响存储库使用的序列化器/映射器,因为存储库使用转换器直接对字节[]进行操作,以基于域类型元数据读取/写入数据。

请参阅参考手册的对象到哈希映射部分,了解如何编写和注册自定义转换器

 类似资料:
  • 我使用Redis作为Spring数据的数据库,没有自定义值或哈希值序列化器。我假设standrad JdkSerializationRedisSerializer应该用于对象序列化。看起来有些对象的临时字段被序列化到数据库中。 我如何克服这个问题?

  • 我正在使用Spring data redis和jedis与aspectJ进行日志记录。但是得到以下错误。请帮助解决此错误。我在这上面花了很多时间,但无法解决它。 我使用的是Spring数据redis 1.4.1,jedis-2.6.1和Redis-2.8 错误详情:- 下面是使用spring data redis的redis Sentinel配置的Java配置文件 下面是用于日志记录的Aspect

  • 是否可以在Jackson中只使用注释序列化没有字段的对象?当我尝试序列化这样一个没有注释的对象时,我得到: 我检查了Jackson注释列表,但没有看到将类注释为没有可序列化数据的方法。我尝试将放在空构造函数上(不希望它工作,因为它是一个反序列化注释),但我得到了同样的错误。没有可将放置在其上的访问器或字段。有什么想法吗? 更新:这样做的原因是我有一个对象列表,这些对象表示可以应用于某种类型的数据的

  • 我的Spring Boot应用程序使用了一个用和注释的类: 现在我想使用一个(私有)REST接口来读取和更新这些配置属性,所以我创建了以下控制器。 不幸的是,这似乎不起作用,因为我在调用endpoint时遇到以下异常: 当出于测试目的删除注释和时,序列化工作正常。所以它似乎必须要做一些事情来处理类是bean?

  • 假设我有以下格式的JSON: 我试图避免自定义反序列化程序,并试图将上述JSON(称为Wrapper.java)反序列化为JavaPOJO。“type”字段指示“object”反序列化,即type=foo表示使用foo.java反序列化“object”字段。(如果type=Bar,则使用Bar.java反序列化对象字段)。Metadata/owner将始终以相同的方式对每个元数据使用简单的带Jac

  • 我有以下控制器: 使用以下请求对象: 当帖子通过并查看我得到的对象时,有效负载列表中有LinkedHashMap对象,而不是我的DTO类型的对象。 如何让Spring jackson将JSON转换为我的DTO对象。请记住,我计划对其他对象列表重用包装器响应DTO,这就是我使用通用列表(List)的原因。 这是我正在尝试的JSON。