2012-10-17 104 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) 

這將使得測試工作,並且代碼做同樣的事情(基本)

相關問題