Selasa, 09 September 2014

JsonCollectionRenderer Bug can not set excludes from RenderContext

Kemarin saya mencoba implemetasi Rendering Partial RESTful Responses ternyata untuk index tidak bekerja dengan baik pada grails versi 2.3.11. Hal ini disebabkan karena terjadi bug pada grails.rest.render.json.JsonCollectionRenderer#renderJson(JSON converter, RenderContext context) Bisa dilihat source code versi 2.3.11 sebagai berikut
 package grails.rest.render.json

import grails.converters.JSON
import grails.rest.render.ContainerRenderer
import grails.rest.render.RenderContext
import groovy.transform.CompileStatic

import org.codehaus.groovy.grails.web.mime.MimeType

/**
 * ....
 */
@CompileStatic
class JsonCollectionRenderer extends JsonRenderer implements ContainerRenderer {
    final Class componentType
    ...
    @Override
    protected void renderJson(JSON converter, RenderContext context) {
        converter.setExcludes(componentType, excludes != null ? excludes : context.excludes)
        converter.setIncludes(componentType, includes != null ? includes : context.includes)
        converter.render(context.getWriter())
    }
}
Dengan melihat kode diatas nilai context.excludes tidak akan bisa di set pada converter karena field excludes tidak pernah null. Seharusnya kode nya adalah sebagai berikut..
 package grails.rest.render.json

import grails.converters.JSON
import grails.rest.render.ContainerRenderer
import grails.rest.render.RenderContext
import groovy.transform.CompileStatic

import org.codehaus.groovy.grails.web.mime.MimeType

/**
 * ....
 */
@CompileStatic
class JsonCollectionRenderer extends JsonRenderer implements ContainerRenderer {
    final Class componentType
    ...
    @Override
    protected void renderJson(JSON converter, RenderContext context) {
        converter.setExcludes(componentType, (excludes || context.excludes==null)? excludes : context.excludes)
        converter.setIncludes(componentType, includes != null ? includes : context.includes)
        converter.render(context.getWriter())
    }
}