从grails 1.3.4升级到grails 2.1.1后无法使用“as JSON”

时间:2012-10-17 13:49:30

标签: json grails-2.0

我正在将grails插件从1.3.4升级到grails 2.1.1。升级后,我现在有一个失败的集成测试,之前没有失败。它无法使用“as JSON”(grails.converters.JSON)。

    @Test
public void testConvertCollectionOfEnvironmentSettingsToJSON() {
    EnvironmentSetting setting = configurationService.getEnvironmentSetting('ENFORCE_SCHEMA_INSTANCE_RULE')

    def jsonSetting = setting as JSON //exception thrown here
    def s = jsonSetting as String

    assertNotNull jsonSetting
}

异常和堆栈跟踪:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'com.company.ipsvc.configuration.domain.EnvironmentSettingAllRevs@48c12420' with class 'com.company.ipsvc.configuration.domain.EnvironmentSettingAllRevs' to class 'grails.converters.JSON'
at com.company.ipsvc.configuration.converter.json.basic.BasicEnvironmentSettingJSONIntegrationTests.testConvertCollectionOfEnvironmentSettingsToJSON(BasicEnvironmentSettingJSONIntegrationTests.groovy:28)

我能够成功使用encodeAsJSON()。我也有与XML相同的问题。

3 个答案:

答案 0 :(得分:5)

我认为转换器(as JSON语法)默认只适用于域对象和集合。

要转换任意对象,我应该使用encodeAsJSON()转换器。或者使用对象编组器,告诉转换器如何处理对象。

虽然文档对此不太清楚..

请参阅:

但是我注意到http://grails.org/doc/latest/api/grails/converters/JSON.html#JSON%28java.lang.Object%29说该对象转换为POGO ..也许这意味着你是否有一个编组员?

我也找到了这个参考:

  

请注意,'as'运算符不会为普通对象重载...

     

域对象可以使用'as'运算符将对象强制转换为JSON,与集合相同。因此,与POGO不同的是,它们必须被按摩到一个列表中或者已经明确地称为encodeJJSON ...

     

http://manbuildswebsite.com/2010/02/08/rendering-json-in-grails-part-2-plain-old-groovy-objects-and-domain-objects/

这似乎描述了这种情况。

答案 1 :(得分:1)

对于非Domain对象,我们发现在运行测试时会出现这种情况......我们的解决方案是使用新的JSON:

render new JSON( obj )

这将允许测试工作,并且代码执行相同的操作(基本上)

答案 2 :(得分:0)

进入类似的问题,使用grails 2.2.1破坏了单元测试。问题是直接的obj as JSON转化尝试。但这被解释为类型转换。

解决方法是将您的obj转换为像[data:obj] as JSON

这样的地图