java - 无法在 Mongodb 中序列化 LocalDate

标签 java json mongodb scala

我正在使用 java 8 java.time.LocalDate 来解析日期。

但试图将 LocalDate 对象插入到 mongodb。我在 Java 驱动程序中遇到错误:

private def writeData(measure: DBCollection, installation: Int, date: String, dates: ListBuffer[LocalDate],
                    values: ListBuffer[BigDecimal], validated: Boolean, overwrite: Boolean) {
  val timeValues: BasicDBList = new BasicDBList
  var i = 0
  while ( i < dates.size )  {
    val obj: BasicDBObject = new BasicDBObject("time", dates(i))
    obj.put("value", values(i).toString())
    timeValues.add(obj)
    i += 1
  }
  if ( debug ) System.out.println("Storedata: " + timeValues.toString) <-- error here

错误日志:

java.lang.RuntimeException: json can't serialize type : class java.time.LocalDate at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:77) at com.mongodb.util.JSONSerializers$MapSerializer.serialize(JSONSerializers.java:317) at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) at com.mongodb.util.JSONSerializers$IterableSerializer.serialize(JSONSerializers.java:290) at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) at com.mongodb.util.JSON.serialize(JSON.java:54) at com.mongodb.util.JSON.serialize(JSON.java:40) at com.mongodb.BasicDBList.toString(BasicDBList.java:38) at web.MeasureAccess.writeData(MeasureAccess.scala:203) at web.MeasureAccess.firstTime(MeasureAccess.scala:52) at web.MeasureAccess$.main(MeasureAccess.scala:262) at web.MeasureAccess.main(MeasureAccess.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

我正在使用 mongo-java-driver-2.13.0-rc1.jar 斯卡拉 2.11.4 和java 1.8.0_25

为了完整性。

最佳答案

不幸的是,MongoDB 驱动程序使用 java.util.Date 类型,请参阅文档 here

因此您必须先将 LocalDate 转换为 Date 实例,例如:

MongoClient mongoClient = new MongoClient("localhost", 27017);
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("testcol");

LocalDate ld = LocalDate.now();
Instant instant = ld.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date date = Date.from(instant);

BasicDBObject doc = new BasicDBObject("localdate", date);
coll.insert(doc);

我建议使用类似 Morphia 的东西或 Jongo但是要包装 MongoDB 驱动程序,因为您可以注册全局映射器以隐式地动态执行这些转换,以便您可以在域模型中使用 LocalDate 等

关于java - 无法在 Mongodb 中序列化 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27799952/

相关文章:

java - 如何将数据库中的问题存储在 servlet 上并显示在 html 页面上?测验申请

java - RestAssured.get(url).statusCode 导致 java.lang.OutOfMemoryError : Java heap space

javascript - 我们如何为另一个页面发送隐藏在 php 中的 jquery 金额字段以检索金额值?

具有数据库中现有特定集合的 MongoDb GridFS

javascript - Meteor - 从另一个模板事件处理程序访问 DOM 元素

javascript - 使用 mongoDB 插入子文档

java - Kindle 中的技术和标准

java - jframe如何实现多线程

javascript - Highcharts:显示峰值

java - 在 liquibase 上用 JSON 内容重构数据库