[
https://issues.apache.org/jira/browse/GROOVY-9662?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17251769#comment-17251769
]
Puneet Behl edited comment on GROOVY-9662 at 12/18/20, 1:48 PM:
----------------------------------------------------------------
This is also happening with Grails Framework after updating to Groovy 2.5.14,
the following code does not behave the same with `CompileStatic`:
{code:java}
import groovy.json.JsonOutput
import groovy.json.StreamingJsonBuilder
import groovy.transform.CompileStatic
import org.springframework.http.HttpMethod
import org.springframework.validation.ObjectError
@CompileStatic
class VndErrorJsonRenderer {
final String LOGREF_ATTRIBUTE = 'logref'
final String MESSAGE_ATTRIBUTE = "message"
final String PATH_ATTRIBUTE = "path"
final String RESOURCE_ATTRIBUTE = "resource"
final String HREF_ATTRIBUTE = "href"
final String LINKS_ATTRIBUTE = "_links"
Writer targetWriter = new StringWriter()
void render() {
StreamingJsonBuilder writer = new StreamingJsonBuilder(targetWriter)
writer.call { ObjectError oe->
writer
call(LOGREF_ATTRIBUTE, "logref")
call(MESSAGE_ATTRIBUTE, "msg")
call(PATH_ATTRIBUTE, "http://localhost:8080")
call(LINKS_ATTRIBUTE) {
call(RESOURCE_ATTRIBUTE) {
call(HREF_ATTRIBUTE, "path")
}
}
}
targetWriter.flush()
}
}
def vndErrorJsonRenderer = new VndErrorJsonRenderer()
vndErrorJsonRenderer.render()
JsonOutput.prettyPrint(vndErrorJsonRenderer.targetWriter.toString())
{code}
was (Author: behlp):
This is also happening with Grails Framework after updating to Groovy 2.5.14,
the following code does not behave the same with `CompileStatic`:
{code:java}
import groovy.json.JsonOutput
import groovy.json.StreamingJsonBuilder
import groovy.transform.CompileStatic
import org.springframework.http.HttpMethod
import org.springframework.validation.ObjectError@CompileStatic
class VndErrorJsonRenderer { final String LOGREF_ATTRIBUTE = 'logref'
final String MESSAGE_ATTRIBUTE = "message"
final String PATH_ATTRIBUTE = "path"
final String RESOURCE_ATTRIBUTE = "resource"
final String HREF_ATTRIBUTE = "href"
final String LINKS_ATTRIBUTE = "_links" Writer targetWriter = new
StringWriter() void render() { StreamingJsonBuilder writer = new
StreamingJsonBuilder(targetWriter) writer.call { ObjectError oe->
writer
call(LOGREF_ATTRIBUTE, "logref")
call(MESSAGE_ATTRIBUTE, "msg")
call(PATH_ATTRIBUTE, "http://localhost:8080")
call(LINKS_ATTRIBUTE) {
call(RESOURCE_ATTRIBUTE) {
call(HREF_ATTRIBUTE, "path")
}
} }
targetWriter.flush()
}
}def vndErrorJsonRenderer = new VndErrorJsonRenderer()
vndErrorJsonRenderer.render()JsonOutput.prettyPrint(vndErrorJsonRenderer.targetWriter.toString())
{code}
> Groovy 3.0.5: Closure delegate is not working properly
> ------------------------------------------------------
>
> Key: GROOVY-9662
> URL: https://issues.apache.org/jira/browse/GROOVY-9662
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 3.0.2, 3.0.3, 3.0.4, 3.0.5, 2.5.14
> Reporter: Puneet Behl
> Assignee: Eric Milles
> Priority: Major
> Attachments: JsonViewWritableScript.groovy, StreamingJsonBuilder.java
>
>
> In Grails Views, we are using closures to generate JSON using
> `StreamingJsonBuilder`. The HAL implementation for an entity now generates an
> incorrect JSON after updating to Groovy 3.
>
> Here is the problem code snipped from
> \{{grails.plugin.json.view.api.internal.DefaultHalViewHelper#links}}:
> {code:java}
> jsonDelegate.call(LINKS_ATTRIBUTE) {
> call(SELF_ATTRIBUTE) {
> call HREF_ATTRIBUTE, viewHelper.link(resource: object, method:
> HttpMethod.GET, absolute: true)
> call HREFLANG_ATTRIBUTE, locale.toString()
> call TYPE_ATTRIBUTE, contentType
> }
> Set<Link> links = getLinks(object)
> for (link in links) {
> call(link.rel) {
> call HREF_ATTRIBUTE, link.href
> call HREFLANG_ATTRIBUTE, link.hreflang?.toString() ?:
> locale.toString()
> def linkType = link.contentType
> if (linkType) {
> call TYPE_ATTRIBUTE, linkType
> }
> }
> }
> }
> {code}
>
> Although the `resolveStatergy` for the closures is `DELEGATE_FIRST` but I
> believe that is not working correctly because it works if I change the above
> to:
> {code:java}
> delegate.call (...
> {code}
>
> To reproduce the issue please checkout
> [https://github.com/grails/grails-views/commits/bugs/groovy-9962]
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)