【问题标题】:How to switch a Spring Roo or Grails project from typical MVC to AJAX/JSON/REST如何将 Spring Roo 或 Grails 项目从典型的 MVC 切换到 AJAX/JSON/REST
【发布时间】:2012-02-13 09:44:22
【问题描述】:

这似乎是一个奇怪的问题,但我试图了解将应用程序转换为使用 Roo 或 Grails 一代控制器(提供基本CRUD 功能)到返回 JSON 响应主体的东西,而不是在 JavaScript 应用程序中使用。

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

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

这对我来说主要是一次学习经历,我愿意接受任何批评或建议,但作为一个问答论坛,我意识到我需要纳入某种客观问题。为了满足这个需求,我问:

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

【问题讨论】:

    标签: java model-view-controller grails groovy spring-roo


    【解决方案1】:

    我最近在一个 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 块。

    您可能还需要更新处理 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'
                        ]
    

    作为输入(例如,update()save() 操作)JSON 和 XML 有效负载将自动解组,并将像表单输入一样绑定,但我发现解组过程是有点挑剔(尤其是 JSON)。

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

    【讨论】:

    • 感谢您如此详尽的回答!这正是我一直在寻找的东西。
    猜你喜欢
    • 2015-02-20
    • 2019-12-16
    • 2023-04-08
    • 2018-01-11
    • 2013-06-09
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多