2

我正在将 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 相同的问题。

4

3 回答 3

5

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

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

不过,文档对此并不是很清楚..

看:

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

我也确实找到了这个参考:

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

域对象可以使用“as”运算符将对象转换为 JSON,与集合相同。因此,与 POGO 不同的是,它们必须被按摩成一个列表或明确调用 encodeAsJSON ...

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

这似乎描述了这种情况。

于 2012-10-18T00:00:44.387 回答
1

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

render new JSON( obj )

这将允许测试工作,并且代码做同样的事情(本质上)

于 2015-06-22T20:46:17.513 回答
0

Ran into a similar issue that broke unit test using grails 2.2.1 . At issue was a straight obj as JSON conversion attempt. But this was interpreted as type casting instead.

The workaround is to stuff your obj to be converted into a map like this [data:obj] as JSON

于 2013-08-06T15:49:33.037 回答