当前位置: 首页 > 面试题库 >

无法在Mongodb中序列化LocalDate

凌意
2023-03-14
问题内容

我正在使用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无法序列化类型:com.mongodb.util.JSONSerializers $
MapSerializer.serialize(JSONSerializers)上com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:77)的类java.time.LocalDate
.java:317)com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79)com.mongodb.util.JSONSerializers
$
IterableSerializer.serialize(JSONSerializers.java:290)com.mongodb.util.ClassMapBased
com.mongodb.util.JSON.serialize(JSON.java:54)处com.mongodb.util.JSON.serialize(JSON.java:40)处com.mongodb.BasicDBList.toString处的serialize(ClassMapBasedObjectSerializer.java:79)
(web.MeasureAccess.writeData(MeasureAccess.scala:203)的web.MeasureAccess。(BasicDBList.java:38)。Web上的firstTime(MeasureAccess.scala:52)。web.MeasureAccess.main(MeasureAccess.scala:262)在sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)在web.MeasureAccess.main(MeasureAccess.scala)在sun.reflect。
com.intellij.rt.execution处java.lang.reflect.Method.invoke(Method.java:483)上的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)上的NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
.application.AppMain.main(AppMain.java:134)DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)上的java.lang.reflect.Method.invoke(Method.java:483)DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)上的java.lang.reflect.Method.invoke(Method.java:483)

我正在使用mongo-java-driver-2.13.0-rc1.jar Scala 2.11.4和Java 1.8.0_25

为了完整性。


问题答案:

不幸的是,MongoDB驱动程序使用该java.util.Date类型,请参见此处的文档

因此,您必须首先将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);

我建议使用类似吗啡或Jongo包裹MongoDB的驱动程序,虽然,以含蓄做对飞这些转换,您可以注册全球映射器,这样就可以使用LOCALDATE的,等等,在你的领域模型



 类似资料:
  • java.lang.runtimeException:json无法序列化类型:在com.mongodb.util.ClassMapBasedObjectSerializer.serializer(ClassMapBasedObjectSerializer.java:77)在com.mongodb.util.ClassMapBasedObjectSerializer.serializer(jsonS

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 问题内容: 我正在使用python包pymongo从mongodb数据库中检索数据。 然后我转换为列表 这是print(l)返回的内容: 现在,我需要转换为JSON,以便可以对其进行操作。 我还尝试遵循 http://api.mongodb.org/python/1.7/api/pymongo/json_util.html 失败:编辑:链接的最新版本为http://api.mongodb.org/

  • 我试图反序列化javax.ws.rs.core.MultiValuedHashMap。 MultivaluedHashMap实现java.io.Serializable,并且有一个公共的、没有arg构造函数。 提前感谢你的帮助。

  • 我从 REST API 获得以下 JSON 作为响应。 并尝试使用下面的代码进行解析,但这不会导致正确的反序列化类型。 下面是我在JSON响应中收到的字段的类。 缺少了什么?

  • 我正试图将流数据从Kafka保存到卡桑德拉。我能够读取和解析数据,但是当我调用下面的行来保存数据时,我会得到一个异常。我的类正在扩展序列化,但不确定为什么我会看到这个错误,在谷歌搜索了3个小时后没有得到多少帮助,有没有人能给出任何指示? 我得到了 sparkException:任务不可序列化 下面是完整的日志 16/08/06 10:24:52错误JobScheduler:运行作业流作业14705