首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将jackson-databind从2.11.4迁移到2.12.13.2后获得转换问题

将jackson-databind从2.11.4迁移到2.12.13.2后获得转换问题
EN

Stack Overflow用户
提问于 2022-05-06 08:01:43
回答 1查看 423关注 0票数 0

我们最近将jackson-databind从3.11.4版本迁移到3.12.13.2版本,see框架从5.2.19版本迁移到5.2.22.RELEASE。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8默认不支持的日期/时间类型java.time.Instant:添加模块"com.fasterxml.jackson.datatype:jackson-datatype-jsr310“以启用处理(

要解决这个问题,我在下面添加了代码

mapper =新的ObjectMapper();

代码语言:javascript
复制
    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());

这解决了问题,但我现在看到对话错误即时类型对话。

预期为"myTime":{"epochSecond":1627413300,"nano":0}

但它的名字是"myTime":1.6274133E9

错误:原因是:期望一个对象,而不是获得键myTime的编号

使用旧版本的工作代码

pom依赖项-

杰克逊-数据库- 2.11.4杰克逊-数据类型-jsr310 310- 2.11.4

示例代码

代码语言:javascript
复制
public class ObjectMapperTest {
 public static void main(String[] args) {

     try{
            ObjectMapper o = new ObjectMapper();
        
           
           Message message = new Message();
           System.out.println(message);
           String s2= o.writeValueAsString(message);
           System.out.println(s2);
         JsonNode i3=   o.readTree(s2);
           System.out.println(i3);
           
     } catch (Exception e) {
         e.printStackTrace();
    }
}

 static class Message
 { 
     private String source;
     @JsonFormat(shape = JsonFormat.Shape.NUMBER, timezone = "UTC")
     private Instant timestamp = Instant.now();
     
    @Override
    public String toString() {
        return "Message [source=" + source + ", timestamp=" + timestamp + "]";
    }
 }

}

输出

代码语言:javascript
复制
  Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}

版本升级后的示例代码

pom退步

杰克逊-数据库- 2.13.2.1杰克逊-数据类型-jsr310 310- 2.13.2

代码更改

只需将以下行添加到上面的代码中

代码语言:javascript
复制
          ObjectMapper o = new ObjectMapper();
          o.registerModule(new JavaTimeModule()); 

输出

代码语言:javascript
复制
  Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
  {"timestamp":1651839918.691000000}
  {"timestamp":1.651839918691E9}

预期输出

代码语言:javascript
复制
  Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-11 07:00:43

我能够通过创建自定义即时序列化程序并将其注册到JavaTimeModule来解决这个问题。

公共类EpochSecondInstantSerializer扩展JsonSerializer {

代码语言:javascript
复制
@Override
public Class<Instant> handledType() {
    return Instant.class;
}

@Override
public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    jsonGenerator.writeStartObject();
    jsonGenerator.writeNumberField("epochSecond", instant.getEpochSecond());
    jsonGenerator.writeNumberField("nano", instant.getNano());
    jsonGenerator.writeEndObject();
}

}

然后使用JavaTimeModule ObjectMapper mapper =新的ObjectMapper().registerModule(新JavaTimeModule().addSerializer(新EpochSecondInstantSerializer()注册;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72138076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档