Groovy JsonOutput/JsonBuilder 可验证问题
Groovy JsonOutput/JsonBuilder issue with Validatable
正在尝试为从特征 grails.validation.Validateable
继承的 class 的简单对象获取 JsonOutput.toJson(obj)
结果:
class Test implements Validateable{
Long id
}
并抛出 Whosebug
异常。
而对于以下纯 class 对象:
class TestSimple {
Long id
}
一切正常。
也用JsonBuilder
测试了这个,结果是一样的。有什么办法解决这个问题吗?
似乎 Validateable
特性添加的某些属性在序列化为 json 时会导致递归调用链。我这里没有完整的根本原因分析,但在 groovy >= 2.5.0 中你可以执行以下操作:
import grails.validation.*
import groovy.json.*
class Abcdefg implements Validateable {
}
def a = new Abcdefg()
/*
properties returned by DefaultGroovyMethods.getProperties(a):
contentHash -> 25e8e25d2e2db8d4c1c300b2dbc5b75c
originalClassName -> Abcdefg
class -> class Abcdefg
errors -> grails.validation.ValidationErrors: 0 errors
constraintsMap -> [contentHash:grails.validation.ConstrainedDelegate@75561c4c, originalClassName:grails.validation.ConstrainedDelegate@771ff7d2]
*/
def generator = new groovy.json.JsonGenerator.Options()
.excludeFieldsByName('errors', 'constraintsMap')
.build()
def json = generator.toJson(a)
println(json)
从 json 序列化中排除 errors
和 constraintsMap
属性并删除 WhosebugException。
假设您不需要特别序列化 errors
和 constraintsMap
这可能是一个选项。
如果你这样做,你将不得不更深入地挖掘并理解为什么会发生这种情况。
正在尝试为从特征 grails.validation.Validateable
继承的 class 的简单对象获取 JsonOutput.toJson(obj)
结果:
class Test implements Validateable{
Long id
}
并抛出 Whosebug
异常。
而对于以下纯 class 对象:
class TestSimple {
Long id
}
一切正常。
也用JsonBuilder
测试了这个,结果是一样的。有什么办法解决这个问题吗?
似乎 Validateable
特性添加的某些属性在序列化为 json 时会导致递归调用链。我这里没有完整的根本原因分析,但在 groovy >= 2.5.0 中你可以执行以下操作:
import grails.validation.*
import groovy.json.*
class Abcdefg implements Validateable {
}
def a = new Abcdefg()
/*
properties returned by DefaultGroovyMethods.getProperties(a):
contentHash -> 25e8e25d2e2db8d4c1c300b2dbc5b75c
originalClassName -> Abcdefg
class -> class Abcdefg
errors -> grails.validation.ValidationErrors: 0 errors
constraintsMap -> [contentHash:grails.validation.ConstrainedDelegate@75561c4c, originalClassName:grails.validation.ConstrainedDelegate@771ff7d2]
*/
def generator = new groovy.json.JsonGenerator.Options()
.excludeFieldsByName('errors', 'constraintsMap')
.build()
def json = generator.toJson(a)
println(json)
从 json 序列化中排除 errors
和 constraintsMap
属性并删除 WhosebugException。
假设您不需要特别序列化 errors
和 constraintsMap
这可能是一个选项。
如果你这样做,你将不得不更深入地挖掘并理解为什么会发生这种情况。