具有spring boot数据mongodb的MongoTemplate的多个Bean

时间:2016-10-20 14:53:15

标签: spring-boot spring-data autowired spring-data-mongodb mongotemplate

起初我使用没有配置的MongoTemplate,
刚刚制作@Autowired和spring根据我的application.yml中的属性制作了一个默认的instanse 属性就像:

spring:
  profiles: default
  data:
    mongodb:
      uri: mongodb://localhost:27017/myDbName

现在我需要在两个不同的数据库中写,我决定创建MongoConfig类
我在这里找到的示例Example

public abstract class AbstractMongoConfig {

private String host;

private int port;

private String database;

//here is Getters and Setters...

public MongoDbFactory mongoDbFactory() throws Exception {
    return new SimpleMongoDbFactory(new MongoClient(host, port), database);
}

abstract public MongoTemplate getMongoTemplate() throws Exception;
}

@Configuration
@ConfigurationProperties(prefix = "primary.mongodb")
public class CommonMongoConfig
        extends AbstractMongoConfig {
    @Primary
    @Override public @Bean(name = "primaryMongoTemplate")
    MongoTemplate getMongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

第二个:

@Configuration
@ConfigurationProperties(prefix = "second.mongodb")
public class SecondaryMongoConfig
        extends  AbstractMongoConfig {
    @Override public @Bean(name = "secondMongoTemplate")
    MongoTemplate getMongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

然后我将application.yml更改为:

spring:
  profiles: default
primary:
  mongodb:
    host: localhost
    port: 27017
    database: myDbName
second:
  mongodb:
    host: localhost
    port: 27017
    database: myDbName2

当我运行应用程序时,它会说我

IllegalArgumentException:Could not resolve placeholder 'spring.data.mongodb.uri' in string value "${spring.data.mongodb.uri}"

当然,我删除了它,因为我不再需要它了! 为什么呢? 然后我尝试将其添加回来。

spring:
  profiles: default
  data:
    mongodb:
      uri: mongodb://localhost:27017/fake #notUsedActually
vkad:
  mongodb:
    host: localhost
    port: 27017
    database: myDbName
gap:
  mongodb:
    host: localhost
    port: 27017
    database: myDbName2

它有效!但是没用过!
MongoTemplate bean创建正确,取决于我的前缀属性,它的好 但为什么我暂时不能删除它? $ {} spring.data.mongodb.uri
Mb我做smth错了吗?

使用注释属性data.mongodb.uri进行Stacktrace。

2016-10-24 13:06:29.372  WARN 15016 --- [  restartedMain] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'databaseConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.data.mongodb.uri' in string value "${spring.data.mongodb.uri}"
2016-10-24 13:06:29.377  INFO 15016 --- [  restartedMain] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report enable debug logging (start with --debug)
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.data.mongodb.uri' in string value "${spring.data.mongodb.uri}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:219) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:193) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:813) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1039) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    ... 21 common frames omitted

1 个答案:

答案 0 :(得分:1)

DatabaseConfig

如果您查看错误消息:

  

使用名称' databaseConfig 创建bean时出错':注入自动装配   依赖失败;嵌套异常是   java.lang.IllegalArgumentException:无法解析占位符   ' spring.data.mongodb.uri'在字符串值" $ {spring.data.mongodb.uri}"

我怀疑你有一个名为DatabaseConfig的类,你自己用@Value("${spring.data.mongodb.uri}");注入属性

删除它,它会起作用!