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

将jackson数据绑定从2.11.4迁移到2.12.13.2后出现转换问题

孔鹤龄
2023-03-14

我们最近将jackson databind从3.11.4版本迁移到了3.12.13.2版本,springframework从5.2.19版本迁移到了3.12.13.2版本。发布至5.2.22。释放。迁移后,我们看到以下异常

Java语言lang.RuntimeException:com。fasterxml。杰克逊。数据绑定。exc.InvalidDefinitionException:Java 8日期/时间类型<代码>Java。时间默认情况下不支持即时:添加模块“com.fasterxml.jackson.datatype:jackson-datatype-jsr310”以启用处理(

为了解决这个问题,我添加了以下代码

映射器=new ObjectMapper();

    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());

这修复了问题,但我现在看到对话错误INSTANT类型的对话。

预期为“myTime”:{“时代第二”:1627413300,“纳米”:0}

但它以“myTime”的形式出现:1.6274133E9

错误:原因是:需要一个OBJECT,而不是得到密钥myTime的NUMBER

使用旧版本的工作代码

pom依赖项-

jackson-datatype-jsr310 - 2.11.4

示例代码

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 + "]";
    }
 }

}

输出

  Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}

版本升级后的示例代码

pom依赖性

2.13.2.1jackson-datatype-jsr310 - 2.13.2

代码更改

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

          ObjectMapper o = new ObjectMapper();
          o.registerModule(new JavaTimeModule()); 

输出

  Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
  {"timestamp":1651839918.691000000}
  {"timestamp":1.651839918691E9}

预期输出

  Message [source=null, timestamp=2022-05-06T12:28:49.004Z]
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}
  {"timestamp":{"epochSecond":1651840129,"nano":4000000}}

共有1个答案

冉子石
2023-03-14

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

公共类Epoch秒dInstantSerializer扩展JsonSerializer{

@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=new ObjectMapper(). registerModule(new JavaTimeModule(). addSerializer(new Epoch秒dInstantSerializer()));

 类似资料:
  • 我正在使用Android Studio 3.2 Canary 14,并试图迁移现有项目以使用AndroidX。从https://developer.android.com/topic/libraries/support-library/androidx-rn听起来,我必须设置(这是在选择“重构到AndroidX…”选项时自动完成的)。我还将目标API级别更新为28。还有人看到这个问题吗? 未能转换

  • 我正在使用杰克逊对象映射器将JSON转换为对象并进行一些转换并将其转换回JSON。 JSON类似于{“id”:“abc1243”,“val”:1,“isDel”:true} 在上面的例子中,val是int,isDel是布尔值。 我的对象定义如下 当我将JSON转换为MyObj时,字符串id和Int val被绑定到字符串中,但布尔值没有绑定,因此我得到null。 Im使用以下方法

  • 问题内容: 将Solr核心迁移到elasticsearch索引的最佳方法是什么? 不推荐使用solr-river-plugin(https://github.com/javanna/elasticsearch-river- solr )。 问题答案: OpenSource Connections中有一个不错的,由爱心人士精心制作的自定义Python工具,您可以用来执行以下操作: https://g

  • 问题内容: 我有一个现有的PHP / MySQL应用程序,我正尝试将其迁移到AngularJS / Firebase,以作为学习这些较新技术的一种方式。 该应用程序在MySQL中具有自己的表架构。一个这样的表如下所示: 我的问题是:如何将这个表结构及其中的数据从MySQL迁移到Firebase? 我尝试通过查询将数据导出到JSON字符串中,例如: 这给出了有效的JSON字符串,例如: 我将其保存在

  • 我正在构建一个Django应用程序,它有几个应用程序。使用SQLite数据库作为后端运行良好。当我试图使用“manage.py migrate”将后端迁移到Oracle时,我发现了以下错误 django.db.utils.DatabaseError:ORA-01950:对表空间“XXXXXX”没有权限 当我在数据库中检查我的用户权限时,它有创建表、视图等的权限。我尝试执行“manage.py sq

  • move key db-index 返回1成功。0 如果key不存在,或者已经在指定数据库中