如何在 Webflux 应用程序上同时使用反应式和非反应式 MongoDB 模板
How to use both reactive and non reactive MongoDB template on Webflux Application
目前,我正在为我的项目开发一个 springboot webflux 应用程序,我在其中使用反应式-mongo-模板和其他反应式实现。现在我有一个由 WebMvc 实现的遗留 spring 启动应用程序(这里我不使用真正的 spring 启动应用程序。只使用通过 mongoDB 配置实现的核心服务)并且它正在使用(正常)mongo-其实施服务的模板。在我的 webflux 应用程序中,我正在尝试使用遗留应用程序中定义的旧服务。
为此,我尝试使用组件扫描 (com.a.b.cservice.core.configuration
) 导入遗留应用程序,但出现了一些错误。问题是它无法正确检测应用程序和非反应性 mongo 模板。
spring 是否仅支持 1 个 mongo 连接?这些是我得到的错误日志;
[main] WARN o.s.b.w.r.c.AnnotationConfigReactiveWebServerApplicationContext - [] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mapperDAOSpringConfigurations': Unsatisfied dependency expressed through field 'mongoTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoTemplate' defined in class path resource
[com/a/b/cservice/core/configuration/MongoConfigurations.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.mongodb.core.MongoTemplate]: Factory method 'mongoTemplate' threw exception; nested exception is java.lang.NoSuchMethodError: com.mongodb.connection.ClusterSettings.getDescription()Ljava/lang/String;
***************************
APPLICATION FAILED TO START
***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
com.mongodb.connection.DefaultClusterFactory.createCluster(DefaultClusterFactory.java:182)
The following method did not exist:
com.mongodb.connection.ClusterSettings.getDescription()Ljava/lang/String;
The method's class, com.mongodb.connection.ClusterSettings, is available from the following locations:
jar:file:/C:/Users/abc/.m2/repository/org/mongodb/mongodb-driver-core/4.0.5/mongodb-driver-core-4.0.5.jar!/com/mongodb/connection/ClusterSettings.class
jar:file:/C:/Users/abc/.m2/repository/org/mongodb/mongo-java-driver/3.12.7/mongo-java-driver-3.12.7.jar!/com/mongodb/connection/ClusterSettings.class
The class hierarchy was loaded from the following locations:
com.mongodb.connection.ClusterSettings: file:/C:/Users/abc/.m2/repository/org/mongodb/mongodb-driver-core/4.0.5/mongodb-driver-core-4.0.5.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of com.mongodb.connection.ClusterSettings
是否有任何解决方法可以使旧版应用程序与带有 mongoDb 的 webflux 应用程序一起使用?或者我是否需要将其作为单独的微服务保留并调用相关端点?
经过一些工作和搜索,我发现问题与 Webflux 无关。纯粹是遗留应用程序和 webflux 驱动程序之间的 mongo 客户端冲突。所以我从旧版中排除了驱动程序,并导入了 spring-boot-starter-data-mongodb
以及响应式 spring-boot-starter-data-mongodb-reactive
版本。 (两者都使用相同的版本 2.3。5.RELEASE)。
ps:在这里发现同样的问题
目前,我正在为我的项目开发一个 springboot webflux 应用程序,我在其中使用反应式-mongo-模板和其他反应式实现。现在我有一个由 WebMvc 实现的遗留 spring 启动应用程序(这里我不使用真正的 spring 启动应用程序。只使用通过 mongoDB 配置实现的核心服务)并且它正在使用(正常)mongo-其实施服务的模板。在我的 webflux 应用程序中,我正在尝试使用遗留应用程序中定义的旧服务。
为此,我尝试使用组件扫描 (com.a.b.cservice.core.configuration
) 导入遗留应用程序,但出现了一些错误。问题是它无法正确检测应用程序和非反应性 mongo 模板。
spring 是否仅支持 1 个 mongo 连接?这些是我得到的错误日志;
[main] WARN o.s.b.w.r.c.AnnotationConfigReactiveWebServerApplicationContext - [] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mapperDAOSpringConfigurations': Unsatisfied dependency expressed through field 'mongoTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoTemplate' defined in class path resource
[com/a/b/cservice/core/configuration/MongoConfigurations.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.mongodb.core.MongoTemplate]: Factory method 'mongoTemplate' threw exception; nested exception is java.lang.NoSuchMethodError: com.mongodb.connection.ClusterSettings.getDescription()Ljava/lang/String;
***************************
APPLICATION FAILED TO START
***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
com.mongodb.connection.DefaultClusterFactory.createCluster(DefaultClusterFactory.java:182)
The following method did not exist:
com.mongodb.connection.ClusterSettings.getDescription()Ljava/lang/String;
The method's class, com.mongodb.connection.ClusterSettings, is available from the following locations:
jar:file:/C:/Users/abc/.m2/repository/org/mongodb/mongodb-driver-core/4.0.5/mongodb-driver-core-4.0.5.jar!/com/mongodb/connection/ClusterSettings.class
jar:file:/C:/Users/abc/.m2/repository/org/mongodb/mongo-java-driver/3.12.7/mongo-java-driver-3.12.7.jar!/com/mongodb/connection/ClusterSettings.class
The class hierarchy was loaded from the following locations:
com.mongodb.connection.ClusterSettings: file:/C:/Users/abc/.m2/repository/org/mongodb/mongodb-driver-core/4.0.5/mongodb-driver-core-4.0.5.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of com.mongodb.connection.ClusterSettings
是否有任何解决方法可以使旧版应用程序与带有 mongoDb 的 webflux 应用程序一起使用?或者我是否需要将其作为单独的微服务保留并调用相关端点?
经过一些工作和搜索,我发现问题与 Webflux 无关。纯粹是遗留应用程序和 webflux 驱动程序之间的 mongo 客户端冲突。所以我从旧版中排除了驱动程序,并导入了 spring-boot-starter-data-mongodb
以及响应式 spring-boot-starter-data-mongodb-reactive
版本。 (两者都使用相同的版本 2.3。5.RELEASE)。
ps:在这里发现同样的问题