java - 无法从appContext.xml : credential type conversion在springboot中创建MongoClient bean

标签 java spring spring-boot spring-mongo spring-mongodb

我有一个使用 MongoDB Spring 的现有 Java 库。该库包含 applcationContext.xml 和 config.properties 文件,用于将其配置为连接到远程 MongoDB 实例并正确执行此操作。

我试图在 SpringBoot 应用程序中使用这个库,使用完全相同的两个文件,但 SpringBoot 似乎在连接 MongoDB 客户端时遇到问题,异常如下。这是我的应用程序类/配置:

@SpringBootApplication
@ImportResource({"applicationContext.xml"})
public class MySpringBootApplication {

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

}

这是一个异常(exception):

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongo': Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'com.mongodb.MongoCredential[]' for property 'credentials'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.mongodb.MongoCredential' for property 'credentials[0]': no matching editors or conversion strategy found
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:742)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
    at org.MyCompany.MySpringBootApplication.main(MySpringBootApplication.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'com.mongodb.MongoCredential[]' for property 'credentials'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.mongodb.MongoCredential' for property 'credentials[0]': no matching editors or conversion strategy found
    at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:605)
    at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:617)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:216)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1577)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1536)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    ... 20 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.mongodb.MongoCredential' for property 'credentials[0]': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:306)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:143)
    at org.springframework.beans.TypeConverterDelegate.convertToTypedArray(TypeConverterDelegate.java:503)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:216)
    at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:590)
    ... 26 more

applicationContext.xml 具有以下 mongoDB 配置:

<context:property-placeholder
  location="classpath:config.properties" />
<mongo:mongo-client 
  id="mongo" 
  replica-set="${mongo.replica.set}" 
  credentials="${mongo.credentials}" />

其中 config.properties 具有 mongo.credentials 的值。

我已经使用了 spring-boot-mongodb 并添加了配置并成功连接,但是该文件中配置了许多其他 bean,我不确定如何在依赖于 mongoClient 的 SpringBoot 中进行连接。弄清楚如何告诉 SpringBoot 正确创建 MongoCredential 会更快(我希望)。

我需要实现 StringToMongoCredentialConverter 吗?或者我注定要将 applicationContext.xml 中的所有内容拉到某个 Java 配置类中?

使用 spring-boot 1.5.4、spring-core 4.3.9、spring-data-mongo 1.9.2

最佳答案

根据Connecting to MongoDB 3.0 with Java Spring中的答案,最终用以下内容替换该元素:

<!-- Seeds -->
<bean id="mongoSeedListID" class="java.util.ArrayList">
<constructor-arg>
    <list>
        <ref bean="mongoSeedlID" />
    </list>
</constructor-arg>
</bean>

<bean id="mongoSeedlID" class="com.mongodb.ServerAddress">
        <constructor-arg type="java.lang.String" name="host" value="DATABASE_HOST" />
        <constructor-arg type="int" name="port" value="DATABASE_PORT" />
</bean>

<!-- Credentials -->
<bean id="mongoCredentialListID" class="java.util.ArrayList">
<constructor-arg>
    <list>
        <ref bean="mongoCredentialID" />
    </list>
</constructor-arg>
</bean>

<bean id="mongoCredentialID" class="com.mongodb.MongoCredential">
        <constructor-arg name="mechanism" value = "#{T(com.mongodb.AuthenticationMechanism).SCRAM_SHA_1}" />
        <constructor-arg type="java.lang.String" name="userName" value="DATABASE_USERNAME" />
        <constructor-arg type="java.lang.String" name="source" value="DATABASE_SOURCE" />
        <constructor-arg type="char[]" name="password" value="DB_USER_PASS" />
</bean>

<!-- MongoClient -->
<bean id="mongoClientID" class="com.mongodb.MongoClient">
        <constructor-arg ref="mongoSeedListID" />
        <constructor-arg ref="mongoCredentialID"  />
</bean>

成功了!

关于java - 无法从appContext.xml : credential type conversion在springboot中创建MongoClient bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49021132/

相关文章:

java - JAX-RS 请求特定媒体类型

spring - @Qualifier 无效

java - 如何使用hibernate在spring boot中实现分页

java - 如何通过读取 JSON 来修复 UnrecognizedPropertyException?

java - 从带有文本的字符串中获取 URL

java - 实例化一个包含注释的类

java - 我如何编写一个 Java 代码,通过使用贪心算法设计来解决这个问题?

java.lang.ClassNotFoundException : org. junit.runners.BlockJUnit4ClassRunner

java - SecurityContextHolder.getContext() 使用 @Async 时的 NPE

spring-boot - 更新到 spring boot 2.2.1 后出现 NoSuchBeanDefinitionException