2012-01-18 25 views
7

这似乎是一个奇怪的问题,但我试图弄清楚“最佳实践”是如何将应用程序设置为使用Roo或Grails的控制器(它提供了基本的CRUD功能)的代码,以返回一个JSON响应体,而不是用于JavaScript应用程序。如何将Spring Roo或Grails项目从典型的MVC切换到AJAX/JSON/REST

这里的技术含糊不清是因为我还没有真正开始这个项目。我仍然试图决定使用哪种(基于Java的)技术,并且看看我应该在过程中学习/使用什么样的生产力工具。它将是一个Web应用程序,它将使用数据库持久层。所有其他细节都在播出。

也许最简单的方法来实现我的目标是开发使用某种AJAX插件开始,但大多数的教程和描述说,从一个正常的MVC体系结构开始。 Roo似乎将其生成的控制器转换为JSON友好的返回类型很困难,而且我对Groovy/Grails不太了解,知道如何做到这一点。

这对我来说主要是一种学习体验,我乐于接受任何批评或建议,但作为Q/A论坛,我意识到我需要纳入某种客观问题。为了满足这个需求,我问:

什么是为Roo和/或Grails中的实体设置AJAX/RESTful界面的最佳方式?

回答

8

我最近在Grails应用程序中完成了这项工作,发现使用生成的控制器并根据内容协商让它们输出JSON或XML或HTML视图非常容易。

Grails手册中的内容是关于内容协商的部分,如果您需要处理JSON或XML输入,请编组。


要获得JSON和XML输出,默认list()方法,它改变这种(我有一个Session对象,在这种情况下......我的域名类之一):

def list() { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    def response = [sessionInstanceList: Session.list(params), sessionInstanceTotal: Session.count()] 
    withFormat { 
     html response 
     json {render response as JSON} 
     xml {render response as XML} 
    } 
} 

默认情况下,您只返回对象的任何位置,您都希望将返回的值替换为withFormat块。

您还可能需要更新您的Config.groovy文件,它处理MIME类型。下面是我有:

grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format 
grails.mime.use.accept.header = true 
grails.mime.types = [ html: ['text/html','application/xhtml+xml'], 
         xml: ['text/xml', 'application/xml'], 
         text: 'text/plain', 
         js: 'text/javascript', 
         rss: 'application/rss+xml', 
         atom: 'application/atom+xml', 
         css: 'text/css', 
         csv: 'text/csv', 
         all: '*/*', 
         json: ['application/json','text/json'], 
         form: 'application/x-www-form-urlencoded', 
         multipartForm: 'multipart/form-data' 
        ] 

为输入(到update()save()动作,例如)JSON和XML有效载荷会自动编排和将被绑定就像一个表单输入会是这样,但我发现解组过程有点挑剔(特别是使用JSON)。

我发现,为了在update()方法中正确处理JSON,class属性必须存在并且对入站JSON对象正确。由于我在客户端应用程序中使用的库并未使其成为一个容易处理的问题,因此我转而使用XML。

+0

谢谢你这么详细的答案!这正是我一直在寻找的东西。 – Andy 2012-01-18 18:10:07

相关问题