我正在将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相同的问题。
答案 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 ...
这似乎描述了这种情况。
答案 1 :(得分:1)
对于非Domain对象,我们发现在运行测试时会出现这种情况......我们的解决方案是使用新的JSON:
render new JSON( obj )
这将允许测试工作,并且代码执行相同的操作(基本上)
答案 2 :(得分:0)
进入类似的问题,使用grails 2.2.1破坏了单元测试。问题是直接的obj as JSON
转化尝试。但这被解释为类型转换。
解决方法是将您的obj转换为像[data:obj] as JSON