I am looking for best practices / solution to make \'respond\' method generate extra metadata in the resulting json along with the collection of entities got from DB.
Based on ideas from
http://mrhaki.blogspot.com/2013/12/grails-goodness-rendering-partial.html
http://groovyc.net/non-trivial-restful-apis-in-grails-part-2/
import grails.converters.JSON
import grails.rest.render.RenderContext
import grails.rest.render.json.JsonCollectionRenderer
import org.codehaus.groovy.grails.web.mime.MimeType
import groovy.transform.CompileStatic
import static groovy.transform.TypeCheckingMode.SKIP
@CompileStatic
class SumoJsonCollectionRenderer extends JsonCollectionRenderer{
SumoJsonCollectionRenderer(Class componentType) {
super(componentType)
}
public SumoJsonCollectionRenderer(Class componentType, MimeType... mimeTypes) {
super(componentType, mimeTypes)
}
@CompileStatic(SKIP)
@Override
protected void renderJson(object, RenderContext context) {
log.debug(object)
log.debug(object.size())
log.debug(object.getTotalCount())
Map tObject = ['results':object]
if(context.arguments?.metadata) {
tObject['metadata'] = context.arguments.metadata
}
super.renderJson(tObject,context)
}
}
register custom CollectionRenderer at resource.groovy
for (domainClass in grailsApplication.domainClasses) {
"json${domainClass.shortName}CollectionRenderer"(SumoJsonCollectionRenderer, domainClass.clazz)
"json${domainClass.shortName}Renderer"(JsonRenderer, domainClass.clazz)
"hal${domainClass.shortName}CollectionRenderer"(HalJsonCollectionRenderer, domainClass.clazz)
"hal${domainClass.shortName}Renderer"(HalJsonRenderer, domainClass.clazz)
}
Request/Response
http://api.mydomain.com:8080/ApiApp/drugs.json?max=5&fields=ndc,id
{"results":[{"id":1,"ndc":"000020803031"},{"id":2,"ndc":"000021200011"},{"id":3,"ndc":"000021407011"},{"id":4,"ndc":"000021975901"},{"id":5,"ndc":"000023004751"}],"metadata":{"total":851,"psize":5,"offset":0}}