Mongo Scalaドライバ(バージョン2.1)を初めて使用しました。私のケースクラスのいくつかを扱う際に奇妙な挙動に気づいています。そのうちのいくつかは認識されませんclassToCaseClassMap
にあるように、その1つのデコードデータが間違ったパスになり、fieldClazzTypeArgs
リストが空であるための行204のエラーjava.util.NoSuchElementException: head of empty list
で終了します。ここでMongo Scala Driver 2.1 - caseクラスエラー
は、スタックトレースの上3分の1程度である。
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)
私のアプリケーションモデル誰かのGoogleカレンダー。ここでは、私のケースのクラスです:
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])
Here is a link to a screenshot showing the contents of the classToCaseClassMap
エラーが発生する点です。
、GoogleWho
、GoogleDateTime
、およびGoogleEventExtendedProperties
の4つのケースクラスを含む、6つのアイテムのマップがスクリーンショットに表示されます。これらのうちの最初のもの(GoogleCalendarEvent
)のみがケースクラスとして適切に識別されます。
私は問題のあるクラスを作りましたsealed
しかし、それは助けになりませんでした。
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)
Hereは、データアクセスコードを示す趣旨であると私は(SBTコンソールまたはのIntelliJ IDEAのScalaコンソールで)それを使用していますか:ここで
は私がCodecRegistryを作成する方法です。
React Mongoバージョン0.11.7でリファクタリングしているアプリは正常に動作していますが、新しいAtlasデータベースを使用するには正式にサポートされているMongo Scalaドライバに移行する必要があります。その時間後に
こんにちは「認識されていない」と認識されないものがあります。 mongoDBドライバと関連してコードのスニペットを投稿することはできますか?例外のスタックトレースも役立ちます。 – Teliatko
多分私はあなたが私の記事を読んだ後にこれを追加しました(残念ながら、私はそれを続けています)。画像には、GoogleCalendarEvent、GoogleWho、GoogleDateTime、GoogleEventExtendedPropertiesの4つのケースクラスを含む6つのアイテムの地図が表示されます。これらのうちの最初のもの(GoogleCalendarEvent)のみがケースクラスとして適切に識別されます。 – KevinD
私は(私の上位3分の1)と協力してstacktraceを追加しました – KevinD