Spring Boot以及如何在云代工厂上配置MongoDB的连接细节?

时间:2016-12-22 23:05:08

标签: spring mongodb cloud cloudfoundry

我目前正在使用mongodb创建一个spring boot web应用程序。在本地,我能够运行我的应用程序,并且正在检索和存储数据。 但不是云代工厂。任何提示,链接或任何帮助我的事情将不胜感激!

问题

当我将它推入云代工厂时,我无法连接到我的mongodb。我知道我们必须在云代工厂配置一些东西以使其工作。我尝试使用mongodb PCF,即使我将它绑定到我的应用程序,它仍然没有运行我的应用程序。我一直在互联网上搜索,试图找到正确的配置。

其他想法

我在使用MongoDb时从未设置用户名和密码。我目前只使用localhost和port27017。也许我需要在我的V_CAP或env varibles上配置凭据,但是我无法在cloudfoundry.com的UI上编辑这些凭据。是否有命令行提示将这些变量配置到cf中?我查看了几个文档,但我不清楚将这些bean添加到哪个配置文件中,或者它是否有助于在云代工厂上运行mongodb Doc1

云代工厂连接错误

  

OUT   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为' indexController的bean时出错':不满意   通过字段表达的依赖性' apL&#39 ;;嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为' appPortList'的bean:调用init方法   失败;嵌套异常是   org.springframework.dao.DataAccessResourceFailureException:超时   在等待匹配的服务器30000毫秒后   ReadPreferenceServerSelector {readPreference =初级}。客户端视图   集群状态是{type = UNKNOWN,servers = [{address = 127.0.0.1:27017,   type = UNKNOWN,state = CONNECTING,   exception = {com.mongodb.MongoSocketOpenException:异常打开   socket},由{java.net.ConnectException:Connection refused}}]引起;   嵌套异常是com.mongodb.MongoTimeoutException:超时之后   等待匹配的服务器时30000毫秒   ReadPreferenceServerSelector {readPreference =初级}。客户端视图   集群状态是{type = UNKNOWN,servers = [{address = 127.0.0.1:27017,   type = UNKNOWN,state = CONNECTING,   exception = {com.mongodb.MongoSocketOpenException:异常打开   socket},由{java.net.ConnectException:Connection refused}}]

引起

2 个答案:

答案 0 :(得分:1)

理论上,Spring启动云连接器应该为你做这个,但我过去遇到过这个问题。

或者,您需要添加一个扩展AbstractMongoConfiguration的spring bean。在此配置中,您必须插入在VCAP_SERVICES环境变量中找到的主机,端口,用户名,数据库名称和密码。

您可以通过使用System.getEnv(" VCAP_SERVICES")获取VCAP_SERVICES变量的值来自动插入它,并使用JACKSON或其他一些JSON库进行解析。

@Configuration
@Profile("cloud")
public class DatabaseConfiguration extends AbstractMongoConfiguration {

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

    @Override
    public String getDatabaseName() {
        return this.databaseName;
    }

    @Override
    @Bean
    public Mongo mongo() throws Exception {
        List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
        ServerAddress address = new ServerAddress("my_host", 7777);
        serverAddresses.add(address);
        return new MongoClient(serverAdresses,
                singletonList(
                        MongoCredential.createCredential(
                                "my_user_name",
                                "my_database_name",
                                "my_password".toCharArray()
                        )
                )
        );
    }
}

关于你的其他想法&#34;。无法编辑CloudFoundry提供的VCAP_SERVICES变量。相反,应该由您的应用程序读取,以便您的应用程序知道在哪里可以找到CF为其提供的mongodb实例。

但是,您可以使用&#39; cf set-env&#39;为您的应用添加更多环境变量。然而,就我所见,这无助于解决您的问题。

答案 1 :(得分:0)

在Spring Framework博客上有关于绑定到CF上的数据服务的博客文章非常好:https://spring.io/blog/2015/04/27/binding-to-data-services-with-spring-boot-in-cloud-foundry

这篇文章在其示例中使用了与JPA的关系,但显示的所有内容也适用于MongoDB。