【问题标题】:Spring boot 2.0.5.RELEASE and mongo 4.0 connection issuesSpring boot 2.0.5.RELEASE 和 mongo 4.0 连接问题
【发布时间】:2019-03-14 08:01:24
【问题描述】:

我正在关注Spring web site上的使用 MongoDB 访问数据教程
我将 Mongo DB 服务器版本 4 作为服务安装
当我使用客户端连接到它时,它的身份验证工作正常。

我面临以下问题:

MongoCommandException: Command failed with error 18: 'Authentication failed'

我看到代码使用的是与服务器版本 4 不兼容的 mongodb-driver-core-3.6.4.jar

如何在不弄乱项目的情况下只升级驱动程序?
为什么他们使用 spring-boot-starter-data-mongodb 而不是 mongodb-driver-sync ?

com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='petUser', source='pets', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:162) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:39) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:68) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:46) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:168) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:46) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:122) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:52) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:127) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) ~[mongodb-driver-core-3.6.4.jar:na]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_181]
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server localhost:27014. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }
    at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:164) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:295) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.CommandHelper.sendAndReceive(CommandHelper.java:84) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:34) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:119) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.access$000(SaslAuthenticator.java:39) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:52) ~[mongodb-driver-core-3.6.4.jar:na]
    ... 9 common frames omitted

这里是项目 POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-accessing-data-mongodb</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>
</project>

更新
maven dependency-plugin 显示依赖于 mongodb:mongodb-driver-core:jar:3.8.0
所以我不确定这个 mongodb-driver-core-3.6.4.jar 来自哪里?

[INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ demo ---
[INFO] com.replaceme:demo:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter-data-mongodb:jar:2.0.5.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.0.5.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.5.RELEASE:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.10.0:compile
[INFO] |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.10.0:compile
[INFO] |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.25:compile
[INFO] |  |  +- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.19:runtime
[INFO] |  +- org.mongodb:mongodb-driver:jar:3.8.0:compile
[INFO] |  |  +- org.mongodb:bson:jar:3.8.0:compile
[INFO] |  |  \- org.mongodb:mongodb-driver-core:jar:3.8.0:compile
[INFO] |  \- org.springframework.data:spring-data-mongodb:jar:2.0.10.RELEASE:compile
[INFO] |     +- org.springframework:spring-context:jar:5.0.9.RELEASE:compile
[INFO] |     +- org.springframework:spring-beans:jar:5.0.9.RELEASE:compile
[INFO] |     +- org.springframework:spring-expression:jar:5.0.9.RELEASE:compile
[INFO] |     +- org.springframework.data:spring-data-commons:jar:2.0.10.RELEASE:compile

更新 2
我从 M2 文件夹中删除了所有 mongodb jar
并将 mongodb 属性添加到 pom 部分:

    <mongodb.version>3.8.0</mongodb.version>

现在我看到一个新错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call the method com.mongodb.connection.DefaultClusterFactory.createCluster(Lcom/mongodb/connection/ClusterSettings;Lcom/mongodb/connection/ServerSettings;Lcom/mongodb/connection/ConnectionPoolSettings;Lcom/mongodb/connection/StreamFactory;Lcom/mongodb/connection/StreamFactory;Ljava/util/List;Lcom/mongodb/event/CommandListener;Ljava/lang/String;Lcom/mongodb/client/MongoDriverInformation;Ljava/util/List;)Lcom/mongodb/connection/Cluster; but it does not exist. Its class, com.mongodb.connection.DefaultClusterFactory, is available from the following locations:

    jar:file:/C:/Users/winUser/.m2/repository/org/mongodb/mongodb-driver-core/3.8.0/mongodb-driver-core-3.8.0.jar!/com/mongodb/connection/DefaultClusterFactory.class

It was loaded from the following location:

    file:/C:/Users/winUser/.m2/repository/org/mongodb/mongodb-driver-core/3.8.0/mongodb-driver-core-3.8.0.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of com.mongodb.connection.DefaultClusterFactory

更新 3

在 Eclipse 之外运行良好,
在命令行中我做了:

mvn package  
cd target
java -jar .\demo-0.0.1-SNAPSHOT.jar

它运行良好,不确定 Eclipse 中的问题是什么。

【问题讨论】:

  • 不清楚你的问题。关于 mongo java 驱动程序不匹配的问题?还是关于例外?帖子中没有足够的信息来分析可能导致 java 驱动程序不匹配的原因。关于异常,您的安全设置似乎不正确。您必须在创建连接和传递用户凭据的位置添加代码。
  • 为什么你认为这是一个 jar 问题?
  • 您是否在 MongoDB 中创建了一个用户并尝试使用它来访问数据库?
  • 如果版本不匹配问题得到解决,您可以在创建连接或 mongo 模板的位置添加代码/配置,我们可以验证您是否正确设置了授权。 .如果您使用的数据库名称不是 admin,则需要传递身份验证数据库名称。类似spring.data.mongodb.authentication-database=yourauthenticationdb
  • 即使使用 mongo db 3.8.2 版本也面临同样的问题。我正在使用 spring 数据与 aws documentDB 连接。

标签: java mongodb spring-boot spring-mongo


【解决方案1】:

查看spring boot呈现的method not found log。

com.mongodb.connection.DefaultClusterFactory.createCluster( Lcom/mongodb/connection/ClusterSettings; Lcom/mongodb/connection/ServerSettings; Lcom/mongodb/connection/ConnectionPoolSettings; Lcom/mongodb/connection/StreamFactory; Lcom/mongodb/connection/StreamFactory; Ljava/util/List;Lcom/mongodb/event/CommandListener; Ljava/lang/String;Lcom/mongodb/client/MongoDriverInformation; Ljava/util/List;)Lcom/mongodb/connection/Cluster;

注意第 7 个参数 Lcom/mongodb/client/MongoDriverInformation。 MongoDriverInformation 类在 3.7 以上版本中已经从 com/mongodb/client 到 com/mongodb 的 moved

看来您的类路径中同时有 3.6.4 和 3.8.0 jar。

所以尝试清理你的类路径,&lt;mongodb.version&gt;3.8.0&lt;/mongodb.version&gt; 是在春季启动发布之前覆盖 mongodb 依赖项的正确方法。

顺便说一句,有待发布的 2.1.0 启动版本会将 mongodb 依赖项更新到 3.8.2 现在它是一个发布候选阶段。

【讨论】:

  • 我执行了 mvn clean 并从 M2 中删除了所有 mongo 驱动程序 jar,我还执行了依赖关系树,但我看不出这个 3.6.4 来自哪里
  • 我不完全确定 3.6.4 来自哪里,因为根据您的属性它应该是 3.8.0。检查目标文件夹以确保它没有与工件打包在一起。它不应该在工件内部。
  • 顺便说一句,您是如何构建/打包和运行代码的?你使用spring boot maven插件吗?还是全部通过maven?
  • 我在 Eclipse 中运行,让我尝试从命令行运行它
  • 好的。可能是 Eclipse 没有从您的 pom 中获取更改。您可以检查 Eclipse 中的部署程序集吗?您是否尝试过项目 -> 使用 maven 清理并右键单击 pom - 更新项目 eclipse ?
【解决方案2】:

我也遇到过这个问题。当我第一次添加 pom 时:

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.4.3</version>
    </dependency>

编译项目后出现:

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call the method com.mongodb.connection.DefaultClusterFactory.createCluster(Lcom/mongodb/connection/ClusterSettings;Lcom/mongodb/connection/ServerSettings;Lcom/mongodb/connection/ConnectionPoolSettings;Lcom/mongodb/connection/StreamFactory;Lcom/mongodb/connection/StreamFactory;Ljava/util/List;Lcom/mongodb/event/CommandListener;Ljava/lang/String;Lcom/mongodb/client/MongoDriverInformation;Ljava/util/List;)Lcom/mongodb/connection/Cluster; but it does not exist. Its class, com.mongodb.connection.DefaultClusterFactory, is available from the following locations:

jar:file:/C:/Users/winUser/.m2/repository/org/mongodb/mongodb-driver-core/3.8.0/mongodb-driver-core-3.8.0.jar!/com/mongodb/connection/DefaultClusterFactory.class

It was loaded from the following location:

file:/C:/Users/winUser/.m2/repository/org/mongodb/mongodb-driver-core/3.8.0/mongodb-driver-core-3.8.0.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of com.mongodb.connection.DefaultClusterFactory

然后我纠正了pom,我解决了这个错误,但是我看到了另一个错误: 这是新的 pom,我认为这只是由于 mongo_version。

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.8.0</version>
    </dependency>

这是新的警告:

com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongodb-driver-core-3.8.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.8.2.jar:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.8.2.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_191]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_191]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_191]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_191]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_191]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_191]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_191]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_191]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.8.2.jar:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.8.2.jar:na]
... 3 common frames omitted

所以这个问题很简单,网络有很多方法可以解决,你只需添加一个注解让spring boot忽略默认的mongo_properties:

@SpringBootApplication(exclude = MongoAutoConfiguration.class)

然后完成!

【讨论】:

    【解决方案3】:

    我认为Overriding dependency versions with Spring Boot 上的这篇文章会对您有所帮助。对于 reactor 替换为 mongodb。 MongoDB 驱动程序本身几乎是向后兼容的,因此强制更新版本应该不会有任何大问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2020-08-06
      • 2021-03-15
      • 2020-12-26
      • 1970-01-01
      • 2019-03-05
      相关资源
      最近更新 更多