2012-10-17 67 views
2

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

@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 'c[email protected]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

我发现我只有这个问题时,我使用Hibernate映射XML文件和不要将该类放入域文件夹中,而是放在src/groovy文件夹中。我需要使用hibernate映射文件来配置域类,所以这只能帮助我缩小问题的范围。 Grails的确实把我的类作为域类和我相比外使用休眠映射文件和未由域文件夹以外的一个产生的唯一的方法是“autowireDomain域文件夹内的域类和一个之间产生的方法“ – mdamman

+0

我发现这个bug http://jira.grails.org/browse/GRAILS-9089看起来可能是相关的,但没有解决方案。 – mdamman

+0

还没有解决方案,但记录了一个错误。 http://jira.grails.org/browse/GRAILS-9513 – mdamman

回答

5

我认为转换器(as JSON语法)只能在域对象和集合上默认工作。

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

的文档是不是对这个很清楚,但..

参见:

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

我没有太觉得这个参考:

请注意,“为”经营者不超载的平纹对象...

域对象可以使用“为”经营者投对象到JSON,就像一个集合一样。所以不像的POGO,他们必须被按摩到列表或已encodeAsJSON显示的调用...

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

这似乎描述的情况。

+0

感谢您的回复!这是一个域对象,它在1.3.4版本上工作。 – mdamman

+0

好的,如果它从1> 2升级停止工作,我不会感到惊讶,但是因为它是一个令人费解的域对象! – sync

+0

相关:http://jira.grails.org/browse/GRAILS-6222“默认JSON ObjectMarshallers应配置在Grails的ApplicationContext中不存在” – MykennaC

0

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

解决方法是将你的东西OBJ转换成地图这样[data:obj] as JSON

1

对于非域对象,我们发现,运行测试时这会突然出现......我们的解决方案是使用新的JSON:

render new JSON(obj) 

这将使得测试工作,并且代码做同样的事情(基本)

相关问题