Last updated by
4 years ago
Page: 1.1-beta2 Release Notes, Version:14
Grails 1.1 Beta 2 Release Notes
XXX of December 2008Grails 1.1 Beta 2 is not out yet, this document summarizes the upcoming features onlySpringSource and the Grails development team are pleased to announce the 1.1 beta 2 release of the Grails web application development framework.Grails is a dynamic web application framework built on Java and Groovy, leveraging best of breed APIs from the Java EE sphere including Spring, Hibernate and SiteMesh. Grails brings to Java and Groovy developers the joys of convention-based rapid development while allowing them to leverage their existing knowledge and capitalize on the proven and performant APIs Java developers have been using for years. Further information about the release can be obtained using the links below:
- Changelog: http://jira.codehaus.org/browse/GRAILS?report=com.atlassian.jira.plugin.system.project:changelog-panel
- Download: http://grails.org/Download
- Documentation: http://grails.org/doc/1.1
New Features
GORM
Better GORM events
Previously, GORM supported beforeInsert, beforeUpdate and beforeDelete events, now there is afterInsert, afterUpdate and afterDelete to complete the picturePersistence of Collections of Basic Types
GORM now supports persisting basic types like String, Integer and so on using a join table:class Person {
static hasMany = [nicknames:String]
}Read-Only Access to Objects
Persistent instances can now be loaded in a read-only state using the read method:def book = Book.read(1)
Default Sort Order
Associations can now be sorted using a default sort order declared at the class level:class Book {
String title
static mapping = {
sort "title"
}
}class Author {
static hasMany = [books:Book]
static mapping = {
books sort:"title"
}
}Batch Fetching
GORM now supports configuring batch fetching (an optimization of lazy loading) using the ORM DSL at the class level:class Book {
String title
static mapping = {
batchSize 15
}
}class Author {
static hasMany = [books:Book]
static mapping = {
books batchSize:15
}
}Improvements to Dynamic Finders
There is a new InList suffix that can be used with dynamic finders:def groovyBooks = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])
def books = Book.findByTitle("Groovy in Action", [cache:true] )
def books = Book.findByTitle("Groovy in Action", [lock:true] )
Legacy Mapping for Unidirectional One-to-manys
Unidirectional One-to-many associations can use the joinTable argument to alter the way they map to the underlying database:class Book {
String title
static belongsTo = Author
static hasMany = [authors:Author] static mapping = {
authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]
}
}
class Author {
String name
static hasMany = [books:Book]
static mapping = {
books joinTable:[name:"mm_author_books", key:'mm_author_id']
}
}Enhanced Enum Support
Enum types can now specify a getId() method that GORM will call to persist the state of an enum. This an alternative to using either the Enum name or the ordinal value to persist and enums state.enum Country {
AUSTRIA('at'),
UNITED_STATES('us'),
GERMANY('de'); final String id Country(String id) { this.id = id }
}Plugins
Global Plugins
Plugins can now be installed globally for all applications:grails install-plugin webtest -global
Multiple Plugin Repositories
Grails now supports the ability to configure multiple plugin repositories by providing a USER_HOMER/.grails/settings.groovy file or a grails-app/conf/BuildSettings.groovy file that contains the configured repository details:grails.plugin.repos.discovery.myRepository="http://svn.codehaus.org/grails/trunk/grails-test-plugin-repo" grails.plugin.repos.distribution.myRepository="https://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"
Automatic Transitive Plugin Resolution
Plugins no longer need to be checked into SVN and will automatically be installed via a plugins metadata when the application is first loaded.In addition, plugin dependencies are now resolved transitively.Plugin Scopes and Environments
Plugins can now be scoped using either the environment or predefined build scopes:def environments = ['dev', 'test'] def scopes = [excludes:'war']
Testing
The Test Framework
The new test framework, available as a plugin for the 1.0.x series, is now integrated in Grails 1.1.The testing framework adds the capability to mock the behavior of all common types including controllers, domain class, tag libraries and url mappings allowing for shorter, fast running unit tests.class SongTests extends grails.test.GrailsUnitTestCase { void testMinimumDuration() { mockDomain(Song) def song = new Song(duration: 0) assertFalse 'validation should have failed', song.validate() assertEquals "min", song.errors.duration } }
Data Binding
Data Binding a Subset of Properties
It is now simpler to bind data to a subset of properties. Previously you could use the syntax:person.properties = params
person.properties["firstName","lastName"] = params
person.properties["firstName","lastName"].each { println it }
Data Binding for Collection Types
Grails now supports data binding to collections types including lists, sets and maps.TODO - code examplesScaffolding
Templates and Dynamic Scaffolding
Dynamic scaffolding now uses the templates that can be installed via the install-templates command.Support for more association types
Scaffolding now supports many-to-many and unidirectional one-to-many associations.
Groovy Server Pages
JSP Tag library support in JSP
GSP now supports the ability to re-use JSP tag libraries:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <fmt:formatNumber value="${10}" pattern=".00"/>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> ${fmt.formatNumber(value:10, pattern:".00")}
Standalone GSP
TODOProject Infrastructure
Log4j DSL
A new Log4j DSL is available that replaces the old way of configuring Log4j:log4j = {
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages' // GSP warn 'org.mortbay.log'
}Flexible Build Configuration
A new grails-app/conf/BuildConfig.groovy file is available that allows you to configure different aspects of the Grails build including output paths and servers used for resolution of plugins:grails.work.dir="/tmp/work" grails.plugins.dir="/usr/local/grails/plugins" grails.project.test.reports.dir="/usr/local/grails/test-reports"
Non-interactive mode
Grails now supports a --non-interactive flag at the command line that can be passed in order to disable any user prompts:grails run-app --non-interactive
Encrypted Data Sources
DataSource passwords can now be encrypted using a supplied codec class:dataSource {
username = "foo"
password = "438uodf9s872398783r"
passwordEncryptionCodec="my.company.encryption.BlowfishCodec"
}Upgrade notes
Grails 1.1 has a number of changes, but should be mostly backwards compatible with 1.0.x series applications. If you have issues please report them. The following is a list of known issues that need to be considered when upgrading- Plugins are not stored in your USER_HOME directory. You will need to re-install your plugins or run:
grails -Dgrails.plugins.dir=./plugins run-app
- Enums are now mapped onto the database with String values instead of ordinals by default
- jsession id is now disabled by default. See GRAILS-3364
- GSP whitespace handling has been changed for the better, you may have more whitespace than before. See GRAILS-3277
- The The grails.testing.reports.destDir config option has been replaced by grails.project.test.reports.dir
- PreInit.groovy is now BuildConfig.groovy
- The allowedMethods property in a controller should now be marked static. Non static version is deprecated but still works and will result in messages on the console.