无法使用 Scala 驱动程序连接到 MongoDB Atlas



我在使用 MongoDB Scala 驱动程序从我的 Scala 应用程序连接到 Mongo DB Atlas 实例时遇到问题

当我尝试创建客户端时,我收到以下错误(从SBT控制台执行此操作(

scala> val url = "mongodb+srv://dbuser:dbpass@host.mongodb.net/test"
url: String = mongodb+srv://dbuser:dbpass@host.mongodb.net/test
scala> val mongoClient: MongoClient = MongoClient(url)
Apr 15, 2018 8:02:55 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[dbname-shard-00-00-randomchars.mongodb.net:27017, dbname-shard-00-01-randomchars.mongodb.net:27017, dbname-shard-00-02-randomchars.mongodb.net:27017], mode=MULTIPLE, requiredClusterType=REPLICA_SET, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500, requiredReplicaSetName='dbname-shard-randomchars
Apr 15, 2018 8:02:55 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server dbname-shard-00-00-randomchars.mongodb.net:27017 to client view of cluster
Apr 15, 2018 8:02:55 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server dbname-shard-00-01-randomchars.mongodb.net:27017 to client view of cluster
Apr 15, 2018 8:02:55 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server dbname-shard-00-02-randomchars.mongodb.net:27017 to client view of cluster
mongoClient: org.mongodb.scala.MongoClient = MongoClient(com.mongodb.async.client.MongoClientImpl@50416ab3)
scala> Apr 15, 2018 8:02:56 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Exception in monitor thread while connecting to server host.mongodb.net:27017
com.mongodb.MongoException: java.lang.NoSuchMethodError: io.netty.buffer.CompositeByteBuf.addComponent(ZLio/netty/buffer/ByteBuf;)Lio/netty/buffer/CompositeByteBuf;
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:136)
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoSuchMethodError: io.netty.buffer.CompositeByteBuf.addComponent(ZLio/netty/buffer/ByteBuf;)Lio/netty/buffer/CompositeByteBuf;
    at com.mongodb.connection.netty.NettyStream.writeAsync(NettyStream.java:182)
    at com.mongodb.connection.netty.NettyStream.write(NettyStream.java:167)
    at com.mongodb.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:403)
    at com.mongodb.connection.InternalStreamConnection.sendCommandMessage(InternalStreamConnection.java:270)
    at com.mongodb.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:253)
    at com.mongodb.connection.CommandHelper.sendAndReceive(CommandHelper.java:84)
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:34)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:91)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:51)
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:127)
    ... 2 more

一段时间后,我也在控制台上反复获得此输出:

java.nio.channels.ClosedChannelException
java.nio.channels.ClosedChannelException

这是我第一次这样做,我不确定我错过了什么。

我已经使用MongoDB CLI和Mongo DB Compass(GUI(测试了端点+凭据,它们都工作正常。

附加信息:

OS Version: macOS High Sierra 10.13.4
MongoDB Atlas version: Version 3.4.14
Mongo DB Scala Driver Version: 2.2
Scala Version: 2.12.5

这是我build.sbt文件(来自 scala-seed 项目的简单文件(:

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.12.5",
      version      := "0.1.0-SNAPSHOT"
    )),
    name := "Hello",
    libraryDependencies ++= Seq(
      scalaTest % Test,
      "org.mongodb.scala" %% "mongo-scala-driver" % "2.2.1",
      "io.netty" % "netty-all" % "4.0.4.Final"
    )
  )

我还暂时允许从MongoDB Atlas上的任何IP访问

classPath 上安装的 netty 版本丢失:CompositeByteBuf.addComponent(ByteBuf),这就是NoSuchMethodError的原因。

pom 中的 Mongo Scala 驱动程序所需的版本是 netty 4.1.17.Final - 所以请确保它位于 classPath 上并且可以被 Scala 驱动程序使用。

最新更新