Grails Goodness: Custom Controller Class with Resource Annotation
In Grails we can apply the @Resource
AST (Abstract Syntax Tree) annotation to a domain class. Grails will generate a complete new controller which by default extends grails.rest.RestfulController
. We can use our own controller class that will be extended by the @Resource
transformation. For example we might want to disable the delete
action, but still want to use the @Resource
transformation. We simply write a new RestfulController
implementation and use the superClass
attribute for the annotation to assign our custom controller as the value.
First we write a new RestfulController
and we override the delete
action. We return a HTTP status code 405 Method not allowed:
// File: grails-app/controllers/com/mrhaki/grails/NonDeleteRestfulController.groovy
package com.mrhaki.grails
import grails.rest.*
import static org.springframework.http.HttpStatus.METHOD_NOT_ALLOWED
/**
* Custom RestfulController where we disable the delete action.
*/
class NonDeleteRestfulController extends RestfulController {
// We need to provide the constructors, so the
// Resource transformation works.
NonDeleteRestfulController(Class domainClass) {
this(domainClass, false)
}
NonDeleteRestfulController(Class domainClass, boolean readOnly) {
super(domainClass, readOnly)
}
@Override
def delete() {
// Return Method not allowed HTTP status code.
render status: METHOD_NOT_ALLOWED
}
}
Next we indicate in the @Resource
annotation with the superClass
attribute that we want to use the NonDeleteRestfulController
:
// File: grails-app/domain/com/mrhaki/grails/User.groovy
package com.mrhaki.grails
import grails.rest.*
@Resource(uri = '/users', superClass = NonDeleteRestfulController)
class User {
String username
String lastname
String firstname
String email
static constraints = {
email email: true
lastname nullable: true
firstname nullable: true
}
}
When we access the resource /users/{id}
with the HTTP DELETE
method we get a 405 Method Not Allowed
response status code.
Written with Grails 2.4.2.