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:
// File: grails-app/domain/mrhaki/sample/Book.groovy
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 BookRepositoryService and override methods of RestfulController to have a fully working Book resource:
// File: grails-app/controllers/mrhaki/sample/BookRestfulController.groovy
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.