簡體   English   中英

無法從appContext.xml在springboot中創建MongoClient Bean:憑證類型轉換

[英]Unable to create MongoClient bean in springboot from appContext.xml: credential type conversion

我有一個使用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);
  }

}

這是例外:

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正確創建MongoCredential的方法。

我是否需要實現StringToMongoCredentialConverter? 還是我注定要把applicationContext.xml中的所有內容拉到某個Java配置類中?

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

根據使用Java Spring連接到MongoDB 3.0中的答案,最終將元素替換為以下內容:

<!-- 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>

而且有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM