Render metadata for pagination from Grails RestfulController index/search actions

前端 未结 1 902
南旧
南旧 2021-01-03 04:23

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.

相关标签:
1条回答
  • 2021-01-03 04:47

    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/

    1. Creat a custom CollectionRenderer e.g., SumoJsonCollectionRenderer.groovy

    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}}
    
    0 讨论(0)
提交回复
热议问题