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

Mongo Scala驱动程序2.1-case类错误

柯琛
2023-03-14

这是我第一次使用Mongo Scala驱动程序(2.1版),在处理我的一些case类时,我注意到了一些奇怪的行为--其中一些类在ClasstocaseClassMap中没有被识别为此类,结果是其中一个类的解码数据走错了路,并以org.mongodb.Scala.bson.codecs.macrocodec第204行的错误java.util.nosuchelementException:head of empty list结束,因为FieldClazzTypeArgs列表为空。

下面是StackTrace的前三分之一左右:

error: class java.util.NoSuchElementException: head of empty list
scala.collection.immutable.Nil$.head(List.scala:420)
scala.collection.immutable.Nil$.head(List.scala:417)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.readDocument(MacroCodec.scala:204)
palladium.calendar.dal.mongodb.Implicits$$anon$2$GoogleCalendarEventMacroCodec$3.readDocument(GoogleCalendarDAO.scala:55)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.readValue(MacroCodec.scala:173)
palladium.calendar.dal.mongodb.Implicits$$anon$2$GoogleCalendarEventMacroCodec$3.readValue(GoogleCalendarDAO.scala:55)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.decode(MacroCodec.scala:104)
palladium.calendar.dal.mongodb.Implicits$$anon$2$GoogleCalendarEventMacroCodec$3.decode(GoogleCalendarDAO.scala:55)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.readDocument(MacroCodec.scala:197)
palladium.calendar.dal.mongodb.Implicits$$anon$8$GoogleCalendarMacroCodec$3.readDocument(GoogleCalendarDAO.scala:61)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.readValue(MacroCodec.scala:173)
palladium.calendar.dal.mongodb.Implicits$$anon$8$GoogleCalendarMacroCodec$3.readValue(GoogleCalendarDAO.scala:61)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.readArray(MacroCodec.scala:187)
palladium.calendar.dal.mongodb.Implicits$$anon$8$GoogleCalendarMacroCodec$3.readArray(GoogleCalendarDAO.scala:61)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.readValue(MacroCodec.scala:174)
palladium.calendar.dal.mongodb.Implicits$$anon$8$GoogleCalendarMacroCodec$3.readValue(GoogleCalendarDAO.scala:61)
org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec$class.decode(MacroCodec.scala:104)
palladium.calendar.dal.mongodb.Implicits$$anon$8$GoogleCalendarMacroCodec$3.decode(GoogleCalendarDAO.scala:61)
com.mongodb.operation.CommandResultArrayCodec.decode(CommandResultArrayCodec.java:52)
com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:53)
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
org.bson.codecs.configuration.LazyCodec.decode(LazyCodec.java:47)
org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101)
com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:56)
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
com.mongodb.connection.ReplyMessage.<init>(ReplyMessage.java:57)
com.mongodb.connection.CommandProtocol.getResponseDocument(CommandProtocol.java:139)
com.mongodb.connection.CommandProtocol.access$000(CommandProtocol.java:51)
com.mongodb.connection.CommandProtocol$CommandResultCallback.callCallback(CommandProtocol.java:271)
com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:48)
com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:23)
com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:470)
com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:464)
com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:119)
com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:115)
com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
com.mongodb.connection.InternalStreamConnection.executeCallbackAndReceiveResponse(InternalStreamConnection.java:378)
com.mongodb.connection.InternalStreamConnection.access$1700(InternalStreamConnection.java:66)
com.mongodb.connection.InternalStreamConnection$ResponseBuffersCallback.onResult(InternalStreamConnection.java:420)
com.mongodb.connection.InternalStreamConnection$ResponseBuffersCallback.onResult(InternalStreamConnection.java:389)
com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onSuccess(InternalStreamConnection.java:562)
com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.access$2200(InternalStreamConnection.java:517)
com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:584)
com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:568)
com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:447)
com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:444)
com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed(AsynchronousSocketChannelStream.java:218)
com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed(AsynchronousSocketChannelStream.java:201)
sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
sun.nio.ch.Invoker.invokeDirect(Invoker.java:157)
sun.nio.ch.UnixAsynchronousSocketChannelImpl.implRead(UnixAsynchronousSocketChannelImpl.java:553)
sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:276)
sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:297)

我的应用程序模拟某人的谷歌日历。以下是我的案例类:

case class GoogleDateTime(date: Option[DateTime] = None, dateTime: Option[DateTime])

case class LongId(id: Long)

case class GoogleCalendarEvent(id: String,
                           status: Option[String] = None,
                           htmlLink: Option[String] = None,
                           created: Option[DateTime] = None,
                           updated: Option[DateTime] = None,
                           creator: Option[GoogleWho] = None,
                           organizer: Option[GoogleWho] = None,
                           summary: Option[String],
                           description: Option[String] = None,
                           location: Option[String] = None,
                           start: GoogleDateTime,
                           end: GoogleDateTime,
                           extendedProperties: Option[GoogleEventExtendedProperties] = None)

case class GoogleCalendarEventList(nextPageToken: Option[String],
                               items: Option[List[GoogleCalendarEvent]])

case class GoogleWho(email: Option[String],
                 displayName: Option[String])

case class GoogleEventSharedProperties(createdBy: Option[String] = None,
                                   sessionType: Option[String] = None,
                                   sessionId: Option[LongId] = None,
                                   locationId: Option[LongId] = None,
                                   roomId: Option[LongId] = None)

case class GoogleEventExtendedProperties(shared: Option[GoogleEventSharedProperties])

这里有一个屏幕截图的链接,显示了发生错误点的classtocaseClassMap的内容。

屏幕截图显示了一个包含六个项目的地图,包括我的四个case类:GoogleCalendareVentGoogleWhoGoogleDateTimeGoogleEventExtendedProperties。只有其中的第一个(GoogleCalendarEvent)被正确标识为case类。

我尝试让有问题的类密封,但没有帮助。

下面是创建CodeCRegistry的方法:

val dtMap = Map(BsonType.DATE_TIME -> classOf[DateTime])

val typeClassReplacedMap = new BsonTypeClassMap(JavaConversions.mapAsJavaMap(dtMap))

val gcCodecProvider = new DocumentCodecProvider(typeClassReplacedMap)

implicit val gcRegistry: CodecRegistry = fromRegistries(fromCodecs(dtCodec),
fromProviders( gcCodecProvider,
classOf[GoogleCalendarEvent],
classOf[GoogleDateTime],
classOf[LongId],
classOf[GoogleEventExtendedProperties],
classOf[GoogleEventSharedProperties],
classOf[GoogleWho],
classOf[GoogleCalendar]),
DEFAULT_CODEC_REGISTRY )

这里的要点展示了数据访问代码以及我如何使用它(在sbt控制台或Intellij IDEA Scala控制台中)。

我正在重构的应用程序在Reactive Mongo0.11.7版本中运行良好,但我们需要将其迁移到官方支持的Mongo Scala驱动程序,以便使用新的Atlas数据库。

共有1个答案

华欣荣
2023-03-14

我修复了从Providers项目重新排序的类似问题。这些家伙A类(B:B)和B类(I:Int)的顺序应该是相反的:fromProviders(ClassOf[B],ClassOf[A])

因此,您应该将ClassOf[GoogleCalendarEvent]放在ClassOf[GoogleEventExtendedProperties]之后

 类似资料:
  • scala-mongo-driver有一个处理case类的很好的文档。http://mongodb.github.io/mongo-scala-driver/2.3/getting-start/quick-tour-case-classs/。在当前情况下,我的case类字段是option[T]值。因此值可以是或。默认编解码器现在将“none”值序列化为null。但如果键的值为none,我想排除它。

  • 服务器上的mongodb版本将比驱动程序版本旧。我的java驱动程序版本是3.6,Mongo-版本显示我是2.4 我该怎么解决这个问题?

  • 我有这个文件test.py: 我想使用此python代码从页面获取页面源。我使用的是chrome驱动程序selenium和python。但是当我启动这个脚本时,我遇到了这个错误: 我在互联网上尝试了几乎所有的解决方案,但每次我遇到其他错误时,有人知道我在这种情况下应该怎么做吗?有人建议我如何解决这个问题吗?

  • 我正试图在eclipse中运行我的第一个webdriver脚本。使用jre1。8.0_1111. 我使用了下面的代码,但它显示了错误。请帮我查一下密码。 错误堆栈 线程“main”java中出现异常。lang.IllegalStateException:驱动程序可执行文件的路径必须由webdriver设置。壁虎。驱动系统属性;有关更多信息,请参阅github。com/mozilla/geckodr

  • 主要内容:JDBC驱动程序是什么?,JDBC驱动程序类型,应该使用哪个驱动程序?JDBC驱动程序是什么? JDBC驱动程序在JDBC API中实现定义的接口,用于与数据库服务器进行交互。 例如,使用JDBC驱动程序,可以通过发送SQL或数据库命令,然后使用Java接收结果来打开数据库连接并与数据库进行交互。 JDK附带的包包含各种类,其类的行为被定义,实现在第三方驱动程序中完成。 第三方供应商在其数据库驱动程序中实现接口。 JDBC驱动程序类型 JDBC驱动程序实现因Java

  • 我正在处理Spring Boot项目,突然遇到应用程序无法加载MySQL jdbc的问题。(我编译了一次这个项目,没有改变任何东西) 这是我的pom.xml: 这是我的application.properties: Logcat: MySQL数据库最初是使用hibernate创建的。这些配置工作正常,但我不确定这里的真正问题是什么 编辑:我删除了。m2文件夹并从一开始安装所有依赖项。