【问题标题】:java: package MongoClientOptions does not existjava: 包 MongoClientOptions 不存在
【发布时间】:2021-12-30 13:55:38
【问题描述】:

我正在尝试使用 springboot 版本 2.6.2 将 log4j 版本升级到 2.16.0。升级后我的代码在连接到 MongoDB 数据库时失败并出现以下错误。与哪个版本的 spring-data-mongodb 兼容springboot 版本 2.6.2。任何人都可以建议哪个版本的 Mongodb 是以下 Java 代码的正确版本。任何帮助将不胜感激

错误:(51,27) java: MongoClientOptions 包不存在。我的 pom.xml 如下所示

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/>
    </parent>

    <groupId>com.sample</groupId>
    <artifactId>SampleService</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SampleService</name>
    <description>Project for  Service</description>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <surefire-plugin.version>2.22.0</surefire-plugin.version>
        <log4j2.version>2.17.0</log4j2.version>

    </properties>

    <dependencyManagement>
        <dependencies>

        </dependencies>
    </dependencyManagement>

    <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-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>3.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-sync</artifactId>
            <version>4.2.3</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
       

    </dependencies>

    <repositories>
        <repository>
            <id>spring-milestone</id>
            <name>Spring Maven MILESTONE Repository</name>
            <url>https://repo.spring.io/libs-milestone</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <systemProperties>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                    </systemProperties>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.2</version>
                <configuration>
                    <arguments>
                        <source>1.8</source>
                        <target>1.8</target>
                        <uberJar>true</uberJar>
                    </arguments>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

我的应用程序 Java 代码:

package com.sample;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;

@SpringBootApplication
public class Application implements CommandLineRunner {

    private static final Logger LOG = LoggerFactory.getLogger(Application.class);
    //private String uri;
    private String database;
    private String host;
    private String username;
    private String password;
    private int port;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        LOG.info("Application Running.......");
        
    }

    public @Bean
    com.mongodb.MongoClient mongoClient() {

        MongoClientOptions.Builder mongoClientOptions = MongoClientOptions.builder().sslInvalidHostNameAllowed(true)
                .sslEnabled(true).applicationName("Sample-Service");
        try {

          KeyStore keystore = KeyStore.getInstance("JKS");
            try (InputStream in = new FileInputStream("/mnt/secrets/keystore.jks")) {
                keystore.load(in, "password".toCharArray());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (CertificateException e) {
                e.printStackTrace();
            }
            

            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(keystore, "password".toCharArray());

            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keystore);

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
            mongoClientOptions.sslContext(sslContext);

        } catch (NoSuchAlgorithmException | KeyStoreException | UnrecoverableKeyException | KeyManagementException e) {
            e.printStackTrace();
        }

        MongoClientOptions mops = mongoClientOptions.build();
        MongoCredential mongoCredential = MongoCredential.createCredential(username, database, password.toCharArray());
        MongoClient mongoClient = new MongoClient(new ServerAddress(host, port), mongoCredential, mops);
        return mongoClient;
    }

//    @Value("${spring.data.mongodb.uri}")
//    public void setUri(String uri) {
//        this.uri = uri;
//    }

    public String getDatabase() {
        return database;
    }

    @Value("${spring.data.mongodb.authentication-database}")
    public void setDatabase(String database) {
        this.database = database;
    }

    public String getHost() {
        return host;
    }

    @Value("${spring.data.mongodb.host}")
    public void setHost(String host) {
        this.host = host;
    }

    public String getUsername() {
        return username;
    }

    @Value("${spring.data.mongodb.username}")
    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    @Value("${spring.data.mongodb.password}")
    public void setPassword(String password) {
        this.password = password;
    }

    public int getPort() {
        return port;
    }

    @Value("${spring.data.mongodb.port}")
    public void setPort(int port) {
        this.port = port;
    }
}

【问题讨论】:

    标签: java mongodb maven log4j spring-batch


    【解决方案1】:

    您的pom.xml 要求使用 mongodb-driver-sync 4.2.3。一些类在 4.x 版本中移动或退役;例如,com.mongodb.MongoClient 现在是 com.mongodb.client.MongoClient。您的代码似乎与 3.x API 兼容。您将不得不花费几分钟来重新设置您的选项设置以与新类兼容。有关更多信息,请参阅 API 文档 https://mongodb.github.io/mongo-java-driver/4.2/apidocs

    更新

    我看了看,迁移到新类并非易事,而且我很长时间没有使用基于非连接字符串的材料,所以我重新编写了上面代码的关键部分。请注意,credentialsslsettingsconnectionstring 对象的构建方式略有不同,起初可能会导致一些混乱。

    import com.mongodb.client.MongoClient;  // interface                                                
    import com.mongodb.client.MongoClients;  // factory                                                 
    import com.mongodb.MongoClientSettings;  // yes, *not* in the .client hierarchy!                    
    import com.mongodb.MongoCredential;
    import com.mongodb.ConnectionString;
    
    
    MongoCredential credentials = MongoCredential.createCredential(
                                       "USER", "ADMIN_DB", "PASSWORD".toCharArray());
    
    String conns = String.format("mongodb://%s:%d/?replicaSet=rs0", "localhost", 27017);
    
    MongoClientSettings.Builder mcsb = MongoClientSettings.builder();
    MongoClientSettings mcs = mcsb
                    .applicationName("Sample-Service")
                    .credential(credentials)                                                          
                    .applyToSslSettings(sslb ->
                                        sslb.enabled(true)                                           
                                       .invalidHostNameAllowed(true))
                    .applyConnectionString(new ConnectionString(conns))
                    .build();
    
    MongoClient client = MongoClients.create(mcs);
    

    【讨论】:

    • 非常感谢您的回复。已按照建议修改了代码,但由于以下错误而失败。在 com.sample.Application 中创建名称为“mongoClient”的 bean 时出错:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.client.MongoClient]:工厂方法 'mongoClient' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError:
    • 在 com.agcs.cids.Application 中创建名称为 'mongoClient' 的 bean 时出错:通过工厂方法进行的 bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [com.mongodb.client.MongoClient]:工厂方法 'mongoClient' 抛出异常;嵌套异常是 java.lang.NoSuchMethodError:
    • ,请您建议如何进行此操作
    • 我不是 spring 或 bean 方面的专家,但这似乎是运行时错误,而不是编译时错误。您确定您的运行时类路径正在获取 4.2.3 核心和同步 jars?
    • 是否有不涉及指定 ConnectionString 的配置? MongoClientOptions 会从 spring.data.mongodb.uri 参数推断它,但使用 MongoClientSettings,指定构建器会忽略 uri 属性。
    【解决方案2】:

    我认为你应该升级你的依赖。请参阅versionpom

    请尝试:

            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-mongodb</artifactId>
                <version>3.3.0</version>
            </dependency>
    
            <!-- reactive: Do you really need it? --> 
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongodb-driver-sync</artifactId>
                <version>4.4.0</version>
            </dependency>
    

    建议

    如果你使用spring-boot,你可以尝试org.springframework.boot:spring-boot-starter-data-mongodb自动配置。

    【讨论】:

    • ,感谢您提供宝贵的解决方案。我已按照建议修改了 pom xml,兼容版本已解决,但在更新 pom xml 后失败并出现以下错误。请您建议这个 com.mongodb.MongoSocketReadException:在 java.lang 的 com.mongodb.internal.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:707) ~[mongodb-driver-core-4.4.0.jar:na] 处接收到异常消息。 Thread.run(Thread.java:748) [na:1.8.0_231]
    • 这个异常可能是由于 Mongo 配置的问题。您应该检查 mongo 是否正常或尝试更改 spring boot mongo 配置,例如使用 url。该配置对我有用:spring.data.mongodb.uri=mongodb://root:123456@127.0.0.1:27017/admin?authSource=admin&amp;authMechanism=SCRAM-SHA-1
    • 谢谢,但我在 openshift 容器中使用 Spring Boot 属性作为机密。而且我正在使用 MongoClientSetting 设置属性。无法使用已使用 MongoClientURI,因为它抛出和错误无法解决符号 'MongoClientURI' spring.data.mongodb.authentication-database=${MONGO_AUTH_DB} spring.data.mongodb.host=${MONGO_HOST} spring.data.mongodb.port=${MONGO_PORT} spring.data.mongodb.username= ${MONGO_USER} spring.data.mongodb.password=${MONGO_PWD}
    • @Buzz Moschetti ,我已按照您的建议进行了尝试,但由于 com.mongodb.MongoSocketReadException: Exception received message at com.mongodb.internal.connection.InternalStreamConnection.translateReadExcep 导致失败:java .net.SocketException: 套接字关闭
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2019-01-11
    • 2022-01-03
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多