Grails Goodness: Using Domain Classes Without Persistence
Normally when we create a domain class in Grails we rely on GORM for all the persistence logic.
But we can use the static property mapWith
with the value none
to instruct Grails the domain class is not persisted.
This can be useful for example if we want to use a RestfulController
for a resource and use the default data binding support in the RestfulController
.
The resource must be a domain class to make it work, but we might have a custom persistence implementation that is not GORM.
By using the mapWith
property we can still have benefits from the RestfulController
and implement our own persistence mechanism.
In the following example we have a simple Book
resource.
We define it as a domain class, but tell Grails the persistence should not be handled by GORM:
package mrhaki.sample
import grails.rest.Resource
@Resource(uri = '/books', superClass= BookRestfulController)
class Book {
static mapWith = 'none'
String title
String isbn
static constraints = {
title blank: false
isbn blank: false
// Allow to set id property directly in constructor.
id bindable: true
}
}
The application also has a Grails service BookRepositoryService
that contains custom persistence logic for the Book
class.
In the following RestfulController
for the Book resource we use BookRepositoryService
and override methods of RestfulController
to have a fully working Book
resource:
package mrhaki.sample
import grails.rest.RestfulController
class BookRestfulController extends RestfulController<Book> {
BookRepositoryService bookRepositoryService
BookRestfulController(final Class<Book> resource) {
super(resource)
}
BookRestfulController(final Class<Book> resource, final boolean readOnly) {
super(resource, readOnly)
}
@Override
protected Book queryForResource(final Serializable id) {
bookRepositoryService.get(Long.valueOf(id))
}
@Override
protected List<Book> listAllResources(final Map params) {
bookRepositoryService.all
}
@Override
protected Integer countResources() {
bookRepositoryService.total
}
@Override
protected Book saveResource(final Book resource) {
bookRepositoryService.add(resource)
}
@Override
protected Book updateResource(final Book resource) {
bookRepositoryService.update(resource)
}
@Override
protected void deleteResource(final Book resource) {
bookRepositoryService.remove(resource.id)
}
}
Written with Grails 3.2.6.