简体   繁体   English

如何使用 redis 序列化 Java Instant 类型

[英]How to serialize Java Instant type using redis

I'm using spring boot 2.0.3 and spring-boot-starter-data-redis.我正在使用 spring boot 2.0.3 和 spring-boot-starter-data-redis。 Also using jackson-datatype-jsr310.也使用jackson-datatype-jsr310。

I want to store Object into redis.我想将 Object 存储到 redis 中。

the object(MyObj):对象(MyObj):

String text;
Instant instant;

Here's my code:这是我的代码:

@Test
public void test() {

    ListOperations<String, MyObj> listOps = redisTemplate.opsForList();

    MyObj o1 = new MyObj();
    o1.setText("foo");
    o1.setInstant(Instant.now());

    listOps.leftPush("foo", o1);

    MyObj o2 = new MyObj();
    o2.setText("bar");
    o2.setInstant(Instant.now());

    listOps.leftPush("foo", o2);

    List<MyObj> list = listOps.range("foo", 0, -1);

    for (MyObj o : list) {
        System.out.println(o.getText());
        System.out.println(o.getInstant());
    }

}

in my RedisConfig:在我的 RedisConfig 中:

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

But when I'm pushing into redis, the error occurs below:但是当我推入redis时,错误发生在下面:

org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Cannot construct instance of java.time.Instant (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) org.springframework.data.redis.serializer.SerializationException:无法读取 JSON:无法构造java.time.Instant的实例(没有创建者,如默认构造,存在):无法从 Object 值反序列化(没有基于委托或基于属性的创作者)

How to serialize java instant type with Redis?如何使用 Redis 序列化 java 即时类型?

Any opinion would be appreciated.任何意见将不胜感激。

While this is quite an old post, I ran into this problem recently and did the lazy man search and found this before deciding to read the class file.虽然这是一篇相当老的帖子,但我最近遇到了这个问题,并在决定阅读类文件之前做了懒惰的人搜索并找到了这个。 I found that you can easily override the default ObjectMapper with a custom one.我发现您可以使用自定义对象轻松覆盖默认的ObjectMapper Use the setObjectMapper(ObjectMapper objectMapper) method on the Serializer to override the default.使用 Serializer 上的setObjectMapper(ObjectMapper objectMapper)方法覆盖默认值。

// Taken from Jackson library
public class Jackson2JsonRedisSerializer<T> implements RedisSerializer<T> {

    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

    private final JavaType javaType;

    private ObjectMapper objectMapper = new ObjectMapper();
    
    // truncated
    
    public void setObjectMapper(ObjectMapper objectMapper) {

        Assert.notNull(objectMapper, "'objectMapper' must not be null");
        this.objectMapper = objectMapper;
    }


You just need to create an ObjectMapper with the JavaTime.Module registered like below您只需要使用注册的 JavaTime.Module 创建一个 ObjectMapper,如下所示

public static ObjectMapper dateMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;

     Jackson2JsonRedisSerializer<MyObj> valueSerializer = new 
         Jackson2JsonRedisSerializer<>(MyObj.class);
     valueSerializer.setObjectMapper(dateMapper());
    }

disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) turns of default behavior. disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)轮流默认行为。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用Spring MongoTemplate将Java 8 Instant作为日期类型保存到MongoDB? - How to save Java 8 Instant to MongoDB as Date type using Spring MongoTemplate? 如何在 Spring Webflux 中将 java.time.Instant 序列化为 ISO 字符串 - How to serialize java.time.Instant as ISO string in Spring Webflux Java:如何将类型Instant转换为XMLGregorianCalendar类型? - Java: How to Convert type Instant to type XMLGregorianCalendar? 如何使用 Spring 和 Jackson 引导在没有纳秒的情况下序列化 Instant? - How to serialize an Instant without nanoseconds using Spring Boot with Jackson? 将springboot与Redis一起使用时,如何将Java对象序列化为json并将Json反转为对象? - How to Serialize Java Object into json and Reverse Json to Object when using springboot with Redis? Java 8:使用Instant,如何检索ZoneId信息 - Java 8 : Using Instant, How to retrieve ZoneId information 尝试使用 jackson 序列化 null Instant 时出错 - error trying to serialize null instant using jackson 使用Kryo将HashMap序列化为Redis - Serialize HashMap into Redis Using Kryo 如何删除 Java Instant 数据类型中的小数点 - How to remove decimal point in an Java Instant data type 如何将日期从 shell 脚本传递到 java 即时数据类型 - How to pass date from shell script to java Instant data type
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM