关于spring-boot中mongodb包的一个奇怪的版本问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于spring-boot中mongodb包的一个奇怪的版本问题相关的知识,希望对你有一定的参考价值。

参考技术A 一个spring-boot的项目中需要连接mongodb,于是在maven中引入了spring-boot-starter-data-mongodb。

为什么引入2.1.0这么老旧的版本,是因为参考另外一个项目中MongoFactory的实现方法。

这种写法在旧的项目里面运行完全正常,但是在新的项目里面却报错。

What???这个SimpleMongoDbFactory我不是已经import了吗???

为什么一个项目没有问题,一个项目报错???
于是我去对比两个项目的不同,发现dependency的版本号不一样。

旧的项目中spring-data-mongodb的版本是2.1.2。

我开始怀疑maven出问题了,于是把这些包全部删除,刷新maven,还是一样的报错。
而且我在mvnrepository.com网站上看到spring-boot-starter-data-mongodb:2.1.0.RELEASE依赖的就是spring-data-mongodb:2.1.3.RELEASE啊

到底问题出在哪里?

最后发现问题不是出之spring-boot-starter-data-mongodb这一层,而是spring-boot-starter-parent这一层。
旧的项目用的是2.1.0.RELEASE,所以spring-data-mongodb的版本是2.1.2.RELEASE。
而新的项目用的是2.3.0.RELEASE,所以spring-data-mongodb的版本是3.0.0.RELEASE,这这个版本确实不支持SimpleMongoDbFactory。

无法在 spring-boot 中禁用 spring-data-mongodb-reactive 自动配置

【中文标题】无法在 spring-boot 中禁用 spring-data-mongodb-reactive 自动配置【英文标题】:Cannot disable spring-data-mongodb-reactive autoconfiguration in spring-boot 【发布时间】:2020-08-04 06:51:02 【问题描述】:

无论我尝试什么,我都无法禁用 spring-data-mongodb-reactive 的自动配置。

属性

spring:
  profiles: dev
  data:
    mongodb:
      uri: "mongodb://user:pw@some-ip.amazonaws.com:27017/my-db"
      repositories:
        type: reactive
      authentication-database: admin

存储库

@Repository
interface IMembersRepository: ReactiveMongoRepository<Member, String> 

MongoConfig

@Configuration
@EnableReactiveMongoRepositories(basePackages = ["com.my.package.repository"])
class MongoConfig : AbstractReactiveMongoConfiguration() 

    override fun reactiveMongoClient(): MongoClient = mongoClient()

    override fun getDatabaseName(): String = "my-db"

    @Bean()
    fun mongoClient() = MongoClients.create()

    @Bean()
    override fun reactiveMongoTemplate() = ReactiveMongoTemplate(mongoClient(), databaseName)

AppConfig

@Configuration
@EnableWebFlux
@ComponentScan("com.my.package")
class AppConfig: WebFluxConfigurer 
    override fun addCorsMappings(registry: CorsRegistry) 
        registry.addMapping("api/**")
    

SpringBootApplication

@SpringBootApplication(exclude = [
    MongoReactiveAutoConfiguration::class,
    MongoReactiveDataAutoConfiguration::class,
    MongoReactiveRepositoriesAutoConfiguration::class,
    MongoAutoConfiguration::class,
    MongoDataAutoConfiguration::class,
    MongoRepositoriesAutoConfiguration::class,
    EmbeddedMongoAutoConfiguration::class
])
class AstridServerApplication

fun main(args: Array<String>) 
    runApplication<AstridServerApplication>(*args)

如您所见,我什至禁用了所有可用的 MongoDB 自动配置,并且 Boot 仍然尝试建立与我没有的本地实例的连接。但我也尝试了不同的组合。

[localhost:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server localhost:27017

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.AsynchronousSocketChannelStream$OpenCompletionHandler.failed(AsynchronousSocketChannelStream.java:117) ~[mongodb-driver-core-3.11.2.jar:na]
    at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129) ~[na:na]
    at java.base/sun.nio.ch.Invoker.invokeDirect(Invoker.java:158) ~[na:na]
    at java.base/sun.nio.ch.Invoker.invoke(Invoker.java:186) ~[na:na]
    at java.base/sun.nio.ch.Invoker.invoke(Invoker.java:298) ~[na:na]
    at java.base/sun.nio.ch.WindowsAsynchronousSocketChannelImpl$ConnectTask.failed(WindowsAsynchronousSocketChannelImpl.java:308) ~[na:na]
    at java.base/sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:389) ~[na:na]
    at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
Caused by: java.io.IOException: The remote computer refused the network connection
    at java.base/sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:299) ~[na:na]
    ... 5 common frames omitted

【问题讨论】:

【参考方案1】:

客户端正在连接到默认地址。我将专注于理解为什么您的配置文件没有生效,而不是“禁用自动配置”。您看到的行为与客户端未接收任何外部配置并使用其内置默认值一致。

【讨论】:

我最终连接到了外部数据库。但我也以本地连接失败告终,因为我没有本地数据库。我不想要这种行为,只是外部连接。

以上是关于关于spring-boot中mongodb包的一个奇怪的版本问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何避免使用 Spring-Boot 下载嵌入式 MongoDb

spring-boot mongodb 4.0 兼容性

Spring-boot数据mongoDB查询嵌套列表

如何在不依赖 MongoDB 的情况下启动 spring-boot 应用程序?

spring-boot整合mongodb多数据源的案例