DEV Community

Eric Helgeson
Eric Helgeson

Posted on Edited on

Grails 4 Upgrade Notes

Grails 4 is the next iteration of the Grails web framework. Grails is a developer friendly framework built on top of Spring-boot, Groovy, and now Micronaut.

Status

Grails 4 is released!

I've ported a non-trivial app from Grails 3.3.9 to 4.0.0 as well as updated to JDK11. The total effort was only a few hours - welcome news to many who are upgrading.

Initial app startup time is about 15 seconds - 2x faster than the same app in Grails 3.3.9.

Reloading has changed and there are a few options. The default option is from spring-dev-tools - fast restart. This restarts your app faster then a normal restart, but still can be extremely slow for large projects.

Hot reloading options are JRebel - a paid option that works for JDK8/11 - or spring-loaded though it only supports JDK8 and is no longer maintained. Instructions for spring-loaded

IDE Support all works in Grails 4 (same as 3.3.9) - IntelliJ is still my recommended IDE for any Grails, Groovy, or Java developer.

Updates

There are tons of updates to Grails 4 and the frameworks it builds upon. Here's a list of updates and release notes you should review if you're updating your apps.

Install

SDKMan makes installing and managing a JVM and many frameworks a snap:

sdk install java 11.0.2-open
sdk install grails 4.0.3

Plugins

Plugins are an essential part of the Grails developer experience. Luckily many plugins that worked in Grails 3 work out of the box in Grails 4 - or with only slight modifications due.

Working Plugins

compile "org.springframework.boot:spring-boot-starter-data-redis"
compile "org.springframework.session:spring-session-data-redis"
  • Spring-Websocket
compile "org.grails.plugins:grails-spring-websocket:2.5.0.RC1"
  • Grails-Quartz
buildscript {
    dependencies {
        classpath 'org.grails.plugins:quartz:2.0.13' // Needed to compile *Job classes
    }
}

dependencies {
    compile 'org.grails.plugins:quartz:2.0.13'
    compile 'org.quartz-scheduler:quartz:2.2.1' // Is not pulled in by default
}
  • Database Migration Plugin 3.1.0.RC1

  • Asset-Pipeline 3.1.0

  • External Config

    • Works - use RC1+
    compile 'org.grails.plugins:external-config:2.0.0'

Not working

Resolved

  • Asset Pipeline Handlebars issue:
    • Needed to update to change //= require handlebars/handlebars.js to //= require handlebars-runtime
2019-01-13 16:59:42.280  WARN --- [nio-8080-exec-1] asset.pipeline.DirectiveProcessor        : Unable to Locate Asset: /handlebars/handlebars.js
Warning: Nashorn engine is planned to be removed from a future JDK release
  • Gson Views
    • Resolved.
    • Unable to render json with simple objects (just get null response)
    • Domain classes dont render:
  Model variable [someDomain] of with value [Description] type [com.x.SomeDomain] is not of the correct type [com.x.SomeDomain]. Stacktrace follows:

Other notes Notes

  • Hot reload for JDK8 only

    • spring-loaded supports only up to JDK8.
    • Fast reload takes about 5-6 seconds (hopefully can improve)
  • org.grails:grails-datastore-rest-client no longer maintained

    • Use a different http client such as
      • micronaut-http-client, http-builder-ng, feign, okhttp, etc
    • Or use the old unmaintained GORM 6 version:
compile('org.grails:grails-datastore-rest-client:6.1.9.RELEASE'){
    exclude group:'org.grails', module:'grails-plugin-converters'
}
Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead
// and
HHH020100: The Ehcache second-level cache provider for Hibernate is deprecated.  See https://hibernate.atlassian.net/browse/HHH-12441 for details.
  • Hide them in logback.groovy
    • logger('org.hibernate.orm.deprecation', ERROR, ['STDOUT'], false)

Notes or tips of your own?

Join us over on the grails-community slack channel or comment below!

Top comments (10)

Collapse
 
robertoschwald profile image
Robert Oschwald •

Grails Cache Plugin: Not working, yet. github.com/grails-plugins/grails-c...

Grails Schwartz Plugin: Not working, yet. github.com/agileorbit/grails-schwa...

Audit-Logging Plugin: Not working, yet. WIP. github.com/robertoschwald/grails-a...

Works:

Db-Migration Plugin: 3.1.0.RC1

Asset-Pipeline-Grails: 3.0.10

Collapse
 
erichelgeson profile image
Eric Helgeson •

Updated with this list, thanks!

Collapse
 
amitpawarrx profile image
amit-pawar-rx •

@eric can you please help me to underdstand how to work with the resultTranformer() in UTC , its giving error with respect to criteria.

groovy.lang.MissingMethodException: No signature of method: grails.gorm.CriteriaBuilder.resultTransformer() is applicable for argument types: (org.hibernate.transform.AliasToEntityMapResultTransformer) values: [org.hibernate.transform.AliasToEntityMapResultTransformer@3213c334]
at org.grails.datastore.gorm.query.criteria.AbstractCriteriaBuilder.invokeMethod(AbstractCriteriaBuilder.java:302)

Collapse
 
erichelgeson profile image
Eric Helgeson •

Stackoverflow may be a better place to ask questions - i'm not sure what your question has to do with this post.

Collapse
 
hybridprogrammer profile image
Jason Heithoff •

Great notes, wanted to add some of mine:

Spring Security CAS will now require this dependency:

compile group: 'org.springframework.security', name: 'spring-security-cas', version: '5.1.5.RELEASE'

An older plugin of mine was using the older hystrix library which isn't supported in spring boot 2 so:

Change:

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '*'

to

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-hystrix', version: '2.1.2.RELEASE'

Collapse
 
tirlaalin profile image
Tirla-Alin •

Great post!

Collapse
 
miguelabautista profile image
miguel bautista • • Edited

Hello. Is there a way to avoid running Bootstrap again after changing a class? my problem is that I have a lot of initialization processes there. thanks

Collapse
 
kanwar007 profile image
vijaykanwar •

Hi Eric

We need to update grail 2.3.8 to latest 4.
What is the best approach to do that?
is any think you can help me on this ?

Thanks
vijay Kanwar

Collapse
 
erichelgeson profile image
Eric Helgeson •

Hi Vijay - I would start by creating a fresh Grails 4 app and pulling over a few parts of the old app at a time - fixing errors as you go. If you find anything that would be useful here - let me know! Also jump on the Grails Slack channel if you have questions.

Collapse
 
purpleraven profile image
purpleraven •

Best information about upgrade to Grails 4