2017-05-29 15 views
2

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エラーが発生する点です。

GoogleWhoGoogleDateTime、および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ドライバに移行する必要があります。その時間後に

+0

こんにちは「認識されていない」と認識されないものがあります。 mongoDBドライバと関連してコードのスニペットを投稿することはできますか?例外のスタックトレースも役立ちます。 – Teliatko

+0

多分私はあなたが私の記事を読んだ後にこれを追加しました(残念ながら、私はそれを続けています)。画像には、GoogleCalendarEvent、GoogleWho、GoogleDateTime、GoogleEventExtendedPropertiesの4つのケースクラスを含む6つのアイテムの地図が表示されます。これらのうちの最初のもの(GoogleCalendarEvent)のみがケースクラスとして適切に識別されます。 – KevinD

+0

私は(私の上位3分の1)と協力してstacktraceを追加しました – KevinD

答えて

0

FWIW、私は同じ問題を持っているhttps://jira.mongodb.org/browse/SCALA-338

を見て、あなたのポストのおかげで、私はそれを何とかコーデックプロバイダの順序だということが分かりました。

最初に私は、他のケースクラスタイプの値を保持するケースクラスがこれらの他のケースクラスの前にリストされていることを確認することで解決することができました。しかし、これまでにも私の問題は解決されませんでしたが、おそらくあなたの特定の状況を解決するのに役立つかもしれません。

単純に2.1.0から2.0.0にダウングレードすると、問題が解決しました。

0

Providersアイテムから並べ替えると同様の問題が修正されました。 この人のクラスA(B:B)およびクラスB(I:int)が逆順にする必要があります:あなたはclassOfを置く必要がありますように fromProviders(classOf [B]、classOf [A])

だから、[検索します[GoogleEventExtendedProperties]

関連する問題