Configure Service Connections for Grails
Page last updated: December 24, 2015
Cloud Foundry provides extensive support for connecting a Grails application to services such as MySQL, Postgres, MongoDB, Redis, and RabbitMQ. In many cases, a Grails application running on Cloud Foundry can automatically detect and configure connections to services. For more advanced cases, you can control service connection parameters yourself.
Auto-Configuration
Grails provides plugins for accessing SQL (using
Hibernate),
MongoDB, and
Redis services.
If you install any of these plugins and configure them in your Config.groovy
or DataSource.groovy file, Cloud Foundry re-configures the plugin with
connection information when your app starts.
If you were using all three types of services, your configuration might look like this:
environments {
  production {
    dataSource {
      url = 'jdbc:mysql://localhost/db?useUnicode=true&characterEncoding=utf8'
      dialect = org.hibernate.dialect.MySQLInnoDBDialect
      driverClassName = 'com.mysql.jdbc.Driver'
      username = 'user'
      password = "password"
    }
    grails {
      mongo {
        host = 'localhost'
        port = 27107
        databaseName = "foo"
        username = 'user'
        password = 'password'
      }
      redis {
        host = 'localhost'
        port = 6379
        password = 'password'
        timeout = 2000
      }
    }
  }
}
The url, host, port, databaseName, username, and password fields in this configuration will be overriden by the Cloud Foundry auto-reconfiguration if it detects that the application is running in a Cloud Foundry environment. If you want to test the application locally against your own services, you can put real values in these fields. If the application will only be run against Cloud Foundry services, you can put placeholder values as shown here, but the fields must exist in the configuration.
Manual Configuration
If you do not want to use auto-configuration, you can configure the Cloud Foundry service connections manually.
Follow the steps below to manually configure a service connection.
Add the
spring-cloudlibrary to thedependenciessection of yourBuildConfig.groovyfile.repositories { grailsHome() mavenCentral() grailsCentral() mavenRepo "http://repo.spring.io/milestone" } dependencies { compile "org.springframework.cloud:spring-cloud-cloudfoundry-connector:1.0.0.RELEASE" compile "org.springframework.cloud:spring-cloud-spring-service-connector:1.0.0.RELEASE" }Adding the
spring-cloudlibrary allows you to disable auto-configuration and use thespring-cloudAPI in yourDataSource.groovyfile to set the connection parameters.Add the following to your
grails-app/conf/spring/resources.groovyfile to disable auto-configuration:beans = { cloudFactory(org.springframework.cloud.CloudFactory) }Add the following
importsto yourDataSource.groovyfile to allowspring-cloudAPI commands:import org.springframework.cloud.CloudFactory import org.springframework.cloud.CloudExceptionAdd the following code to your
DataSource.groovyfile to enable Cloud Foundry’sgetCloudmethod to function locally or in other environments outside of a cloud.def cloud = null try { cloud = new CloudFactory().cloud } catch (CloudException) {}Use code like the following to access the cloud object:
def dbInfo = cloud?.getServiceInfo('myapp-mysql') url = dbInfo?.jdbcUrl username = dbInfo?.userName password = dbInfo?.password
The example DataSource.groovy file below contains the following:
- The 
importsthat allowspring-cloudAPI commands - The code that enables the 
getCloudmethod to function locally or in other environments outside of a cloud - Code to access the cloud object for SQL, MongoDB, and Redis services
 
import org.springframework.cloud.CloudFactory
import org.springframework.cloud.CloudException
def cloud = null
try {
    cloud = new CloudFactory().cloud
} catch (CloudException) {}
dataSource {
    pooled = true
    dbCreate = 'update'
    driverClassName = 'com.mysql.jdbc.Driver'
}
environments {
    production {
        dataSource {
            def dbInfo = cloud?.getServiceInfo('myapp-mysql')
            url = dbInfo?.jdbcUrl
            username = dbInfo?.userName
            password = dbInfo?.password
        }
        grails {
            mongo {
                def mongoInfo = cloud?.getServiceInfo('myapp-mongodb')
                host = mongoInfo?.host
                port = mongoInfo?.port
                databaseName = mongoInfo?.database
                username = mongoInfo?.userName
                password = mongoInfo?.password
            }
            redis {
                def redisInfo = cloud?.getServiceInfo('myapp-redis')
                host = redisInfo?.host
                port = redisInfo?.port
                password = redisInfo?.password
            }
        }
    }
    development {
        dataSource {
            url = 'jdbc:mysql://localhost:5432/myapp'
            username = 'sa'
            password = ''
        }
        grails {
            mongo {
                host = 'localhost'
                port = 27107
                databaseName = 'foo'
                username = 'user'
                password = 'password'
            }
            redis {
                host = 'localhost'
                port = 6379
                password = 'password'
            }
        }
    }
}