如何将Spring Roo或Grails项目从典型的MVC切换到AJAX/JSON/REST

And*_*ndy 7 java model-view-controller grails groovy spring-roo

这似乎是一个奇怪的问题,但我试图了解转换应用程序的"最佳实践"是什么,该应用程序设置为使用Roo或Grails的一代控制器(提供基本的CRUD功能)之类的东西返回到JSON响应主体的东西,而不是在JavaScript应用程序中使用.

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

也许实现我的目标最简单的方法是开始使用某种AJAX插件开始,但大多数教程和描述都说从一个普通的MVC架构开始.Roo似乎很难将它生成的控制器转换为JSON友好的返回类型,而且我不熟悉Groovy/Grails知道如何做到这一点.

这对我来说主要是一种学习经历,我对任何批评或建议持开放态度,但作为一个Q/A论坛,我意识到我需要纳入某种客观问题.为了满足这种需求,我问:

在Roo和/或Grails中为我的实体设置AJAX/RESTful接口的最佳方法是什么?

cde*_*zaq 8

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

要查看的Grails手册中的位置是内容协商的部分,如果需要处理JSON或XML输入,请进行编组.


要获取JSON和XML输出,在默认list()方法中,将其更改为this(我有一个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}
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,只返回一个对象的任何位置,您将需要用withFormat块替换返回的值.

您还可能需要更新其处理mime类型的Config.groovy文件.这就是我所拥有的:

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'
                    ]
Run Code Online (Sandbox Code Playgroud)

作为输入(例如,对于一个update()或一个save()动作),JSON和XML有效负载将自动被解组并且将被绑定,就像表单输入一样,但我发现解组过程有点挑剔(尤其是使用JSON).

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