user152468
user152468

Reputation: 3242

Spring boot inject mongodb datasource

I am trying to deploy a spring boot application connected to a mongodb instance to cloud foundry.

cf create-service MongoService default my-mongo
cf push myapp --no-start
cf bind-service myapp my-mongo
cf start myapp

The connection details to the mongodb instance are in the VCAP_SERVICES environment variable. When deploying my application to cloudfoundry spring boot is trying to access mongodb on localhost:27017 and obviously fails.

I would like to parse the VCAP_SERVICES environment variable, construct some mongodb connection details from it and provide this as a spring bean. Which class should I use for these configuration details?

Upvotes: 1

Views: 1274

Answers (2)

Corby Page
Corby Page

Reputation: 1405

With Spring Boot, you don't need to manually parse VCAP_SERVICES. If you are using MongoTemplate or MongoRepository, it will automatically connect to the bound instance.

Make sure that you have spring-boot-starter-parent identified as the parent artifact in your pom.xml.

You can add the following to your pom.xml to ensure that the cloud connector code is getting picked up:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cloud-connectors</artifactId>
    </dependency>

Of course, you also need the MongoDB Spring Data dependency:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

Upvotes: 1

Lech Migdal
Lech Migdal

Reputation: 3978

You may want to try setting up the configuration parameters, like a workaround I had to implement with MySQL, check this question.

For me it all came down to properly defining following properties:

spring:
  datasource:
    url: jdbc:mysql://${vcap.services.mydb.credentials.host}:${vcap.services.mydb.credentials.port}/${vcap.services.mydb.credentials.name}
    driver-class-name: com.mysql.jdbc.Driver
    username: ${vcap.services.mydb.credentials.user}
    password: ${vcap.services.mydb.credentials.password}

Upvotes: 0

Related Questions