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.