【问题标题】:Unable to use "as JSON" after upgrading to grails 2.1.1 from grails 1.3.4从 grails 1.3.4 升级到 grails 2.1.1 后无法使用“as JSON”
【发布时间】:2012-10-17 13:49:30
【问题描述】:

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

【问题讨论】:

  • 我发现只有在使用休眠映射 xml 文件并且不将类放在域文件夹中而是在 src/groovy 文件夹中时才会出现问题。我需要使用休眠映射文件配置域类,所以这只有助于我缩小问题的范围。 Grails 确实将我的类视为域类,我比较了使用休眠映射文件在域文件夹内的域类和外部域类之间生成的方法,唯一不是由域文件夹外部生成的方法是“autowireDomain”
  • 我发现这个错误jira.grails.org/browse/GRAILS-9089 看起来可能相关,但没有解决方案。
  • 尚无解决方案,但记录了一个错误。 jira.grails.org/browse/GRAILS-9513

标签: json grails-2.0


【解决方案1】:

我认为转换器(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/

这似乎描述了这种情况。

【讨论】:

  • 感谢您的回复!这是一个域对象,它适用于 v 1.3.4。
  • 好的,如果它从 1 > 2 升级停止工作,我不会感到惊讶,但因为它是一个令人费解的域对象!
  • 相关:jira.grails.org/browse/GRAILS-6222 "当 Grails ApplicationContext 不存在时,应配置默认 JSON ObjectMarshallers"
【解决方案2】:

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

render new JSON( obj )

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

【讨论】:

    【解决方案3】:

    遇到了一个类似的问题,该问题破坏了使用 grails 2.2.1 进行的单元测试。有问题的是直接的obj as JSON 转换尝试。但这被解释为类型转换。

    解决方法是将要转换的 obj 填充为这样的地图 [data:obj] as JSON

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多