Search code examples
micronaut

Micronaut Read data base connection string from file Groovy code


Currently I am setting database connection information in the application.yaml file. For production deployment I need to read the database connection string from file.

in Gitter I got the tip to use micronaut.config.files value, but its not working.

I defined DB connection values in dbinfo.properties file, then update build.gradle file to like this.

run {
    environment('micronaut.environments','dev')
    environment 'micronaut.config.files', 'C:\\shared\\application.dev.properties'    
}

in application.yaml

dataSource:
  url: ${DBURL}
  dbCreate: create-update
  pooled: true
  jmxExport: true
  driverClassName: com.mysql.cj.jdbc.Driver
  dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  username: ${DBUSER}
  password: ${DBPASSWORD}

when I run its giving below error message.

Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [org.grails.orm.hibernate.HibernateDatastore]: Could not resolve placeholder ${DBURL} in value: ${DBURL}

Is there an example code to read data base connection string from file Micronaut Groovy code?

Thanks

SR

Update: 2/26/19

I updated build.gradle file like this still same error.

run {
    systemProperty('micronaut.environments','dev')
    systemProperty('micronaut.config.files', 'C:\\shared\\application.dev.properties')
}

from Application.grooy file

class Application {
    static void main(String[] args) {      
        String filename=System.properties['micronaut.config.files']
        File f= new File(filename)
        if( f.exists()){
            println "File found: $filename"
            println f.text
        } else{
            println "file not found : $filename"
        }
        Micronaut.run(Application)
    }
}

Error message

19:31:49.925 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [dev]
19:31:50.700 [main] INFO  i.m.c.h.g.HibernateDatastoreFactory - Starting GORM for Hibernate
19:31:50.925 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Bean definition [org.grails.orm.hibernate.HibernateDatastore] could not be loaded: Error instantiating bean of type [org.grails.orm.hibernate.HibernateDatastore]: Could not resolve placeholder ${DBURL} in value: ${DBURL}
io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [org.grails.orm.hibernate.HibernateDatastore] could not be loaded: Error instantiating bean of type [org.grails.orm.hibernate.HibernateDatastore]: Could not resolve placeholder ${DBURL} in value: ${DBURL}
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1040)
    at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:201)
    at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:2034)
    at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:156)
    at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:143)
    at io.micronaut.runtime.Micronaut.start(Micronaut.java:67)
    at io.micronaut.runtime.Micronaut.run(Micronaut.java:274)
    at io.micronaut.runtime.Micronaut.run(Micronaut.java:260)
    at webapp.Application.main(Application.groovy:30)
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [org.grails.orm.hibernate.HibernateDatastore]: Could not resolve placeholder ${DBURL} in value: ${DBURL}
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1335)
    at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:1902)
    at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:1543)
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1038)
    ... 8 common frames omitted
Caused by: io.micronaut.context.exceptions.ConfigurationException: Could not resolve placeholder ${DBURL} in value: ${DBURL}

Solution

  • You're confusing environment variables with system properties

    run {
        systemProperty('micronaut.environments','dev')
        systemProperty('micronaut.config.files', 'C:\\shared\\application.dev.properties')  
    }
    

    EDIT: The above will cause the file to be a property source in the application, however it won't supply environment variables like DBURL. It doesn't make sense to attempt to use a configuration file to supply those values.

    Either supply those values with environment variables directly, or remove the values from config and allow the imported configuration file to provide them.

    For example, remove dataSource.url from application.yml and then set dataSource.url=someurl in C:\\shared\\application.dev.properties