我在使用 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 驱动程序使用。