Search code examples
grailsgrails-orm

standalone gorm - grails 2.4 - messages.properties not getting loaded


We are evaluating GORM as a replacement out hibernate code in backend, my messages.properties file is not getting loaded...... what am i doing wrong?

Here is my script and output :

$cat GORM_TEST.groovy**

import grails.orm.bootstrap.*
import grails.persistence.*
import org.springframework.jdbc.datasource.DriverManagerDataSource
import org.h2.Driver

init = new HibernateDatastoreSpringInitializer(Person)
def dataSource = new DriverManagerDataSource(Driver.name,     
"jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE", 'sa', '')
init.configureForDataSource(dataSource)


Person p1 = new Person();
p1.name = "Vinay"
p1.save();
Person p2 = new Person();
p2.name = ""
if (! p2.validate() ) {
p2.errors.allErrors.each {
    println it.dump()
}
}
p2.save();
println "Total people = " + Person.list()`

$cat messages.properties
person.name.blank=BLANK VALUE PROVIDED?????
person.name.blank.name=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I added following dependencies to CLASSPATH dependencies to CLASSPATH

org.grails:grails-datastore-gorm-hibernate4:3.1.0.RELEASE  
org.grails:grails-spring:2.4.0

$groovy GORM_TEST2.groovy

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: insert into person (id, version, name) values (null, ?, ?)
<org.springframework.validation.FieldError@71be79f5 field=name rejectedValue=
bindingFailure=false objectName=Person codes=[Person.name.blank.error.Person.name, 
Person.name.blank.error.name, Person.name.blank.error.java.lang.String, 
Person.name.blank.error, person.name.blank.error.Person.name,    
person.name.blank.error.name, person.name.blank.error.java.lang.String,   
person.name.blank.error, Person.name.blank.Person.name, Person.name.blank.name, 
Person.name.blank.java.lang.String, Person.name.blank, person.name.blank.Person.name,    
person.name.blank.name, person.name.blank.java.lang.String, person.name.blank, 
blank.Person.name, blank.name, blank.java.lang.String, blank] arguments=[name, class 
Person] defaultMessage=Property [{0}] of class [{1}] cannot be blank>
Hibernate: select this_.id as id1_0_0_, this_.version as version2_0_0_, this_.name as 
name3_0_0_ from person this_

Total people = [Person(Vinay), Person(Vinay), Person(Vinay), Person(Vinay), 
Person(Vinay), Person(Vinay), Person(Vinay), Person(Vinay), Person(Vinay), 
Person(Vinay)]

I tried putting messages.properties in ./grails-app/i18n/ as well as ./i18n but no help....


Solution

  • GORM uses Spring's MessageSource concept for loading messages. When used standalone no MessageSource is configured. It is up to you to provide one. You can do this by overriding the getBeanDefinitions method:

     init = new HibernateDatastoreSpringInitializer(Person) {
        Closure getBeanDefinitions(BeanDefinitionRegistry beanDefinitionRegistry) {
             def parentDefinitions = super.getBeanDefinitions(beanDefinitionRegistry)
             return {
                   parentDefinitions.delegate = delegate
                   parentDefinitions.call()
                   messageSource(ResourceBundleMessageSource) {
                       basenames = ['file:messages']
                   }
             }
        }
     }