2014-09-02 63 views
0

我具有類似於下面的控制器(RestfulController)代碼:如何在Grails中將純對象呈現爲JSON,XML?

def doSomethingAwesome() { 
    Domain domainObject = prepareDomainObject() 
    //do something on the domain object 
    Model model = new Model(name: domainObject.name, description: domainObject.description) 
    respond model 
} 

如可以看到的,我試圖與包裹Model對象內部的數據進行響應。但是,Model類不是一個域類;它只是一個普通的Groovy類。當我嘗試單獨測試此代碼時,我得到它通過,但是當我使用所有其他測試進行測試時,我得到GroovyCastException表示該對象不能轉換爲JSON。

我搜索出來的一些文章暗示我將模型對象放在地圖中,然後讓地圖得到渲染。例如:

render ['model': model] as JSON 

但是,這不是我想要的響應消息。另外,XML消息看起來非常不同。

+0

是不是簡單地渲染模型爲JSON?目前的反應如何,你想怎麼樣? – matcauthon 2014-09-02 09:51:05

+0

由於我在內部認爲這是'響應'基本上做的事情,因此呈現爲JSON並不行。模型只是一個普通的Groovy類。你可以認爲上面的'name'和'description'是它的所有屬性。我希望響應看起來像是如何在沒有外部容器對象包裝它的情況下渲染模型對象。 – 2014-09-02 10:37:19

+0

render(contentType:「application/json」){ book(title:b.title,author:b.author) from here:http://grails.org/doc/2.3.4/ref/Controllers/ render.html也許這會幫助你? – MNie 2014-09-02 11:24:56

回答

0

Grails的2.4.3示範項目在https://github.com/jeffbrown/pogorespond演示傳遞POGO(不是域類)的respond方法。 https://github.com/jeffbrown/pogorespond/blob/1646c64fe2b37856fc87b64ae1cf5a6c4fd44cb1/grails-app/controllers/demo/DemoController.groovy包含以下內容:

package demo 

class DemoController { 

    static responseFormats = ['json'] 

    def index() { 
     def m = new Model(name: 'Some Name', description: 'Some Description') 
     respond m 
    } 
} 

class Model { 
    String name 
    String description 
} 
+1

該示例僅在「responseFormats」中包含'json',但當然您可以使用任何想要支持的內容。如果你願意的話,你可以完全放棄這一點。如果您使用Accept標頭髮送指示您想要「application/json」或「application/xml」的請求(例如),它仍然有效。 – 2014-09-02 19:40:04

+0

我仍在使用2.3.11,因爲我認爲2.4.x需要Java 7(我仍然需要升級到Java)。 POGO渲染僅在2.4.3上可用?另外我注意到控制器不再擴展'RestfulController'。如果我理解正確,'responseFormats'只能被'RestfulController'子類使用。在2.4.x中做了這個改變,還是我誤解了它? – 2014-09-03 02:25:39

+0

「我認爲2.4.x需要Java 7」 - 我不認爲這是正確的。 – 2014-09-03 02:56:07