Grails 2.2.3和2.3.11之间的JSON / XML默认响应格式更改

时间:2016-03-17 20:50:55

标签: jquery json ajax grails gsp

我们的问题的根本症状是,在将我们的项目从Grails 2.2.3切换到2.3.11之后,我们的jQuery Ajax调用开始返回XML而不是JSON。

下面的代码片段说明了如何在我们的GSP,控制器和服务中配置内容,并显示作为对象返回的静态数据集的示例(包含代码/名称值字符串对的映射列表)。控制器使用withFormat子句将此列表返回给GSP。在Grails 2.2.3中,这始终是JSON,但现在在2.3.11中,它是XML。

通过实验,我发现如果我改变控制器中withFormat子句中JSON和XML行的顺序,将JSON放在第一位,那么一切正常。我喜欢改变每个控制器中的每个动作以使其再次工作的想法。

  • Grails 2.3.x中有哪些改变以打破现有功能?
  • 我们如何改变这些调用以获得所需的JSON功能而不是XML?
  • 这似乎应该能够在应用程序级别配置,而不是更改每个jQuery Ajax调用或更改每个控制器操作。

myTest.gsp

var fetchData = function () {
    $.ajax({
        url: "${g.createLink(controller:'myController', action:'myAction')}",
        async: true,
        type: 'get',
        dataType: "json",
        success: function (data) {
            if (data) {
                // Not shown -- Do something useful with the data
            }
        },
        error: function (request, status, error) {
            show.alert("Error with the data. \nStatus: " + status + ", \nError: " + error );
        }
    });
};

MyController.groovy

class MyController {
    def myService
    ...
    def myAction() {
        def results = myService.myAction()
        withFormat {
            xml { render results as XML }
            json { render results as JSON }
        }
    }
    ...        
}

MyService.groovy

class MyService {
    def myMap = [ AK: 'Alaska', AL:'Alabama', ... , WY:'Wyoming' ]
    def myAction() {
        def results = []
        myMap.each {
            def item = [:]
            item.code = it.key
            item.name = it.value
            result.add(item)
        }
        return results
    }
}    

Config.groovy中

grails.mime.use.accept.header = true

更新

我有一个"修复",但我对它不是很满意,并欢迎在2.2.3和2.3.11之间为什么这个功能破裂的替代答案或解释。

我在控制器操作中改变了withFormat闭包中JSON和XML类型的顺序,将JSON放在第一位,问题解决了#34;。

我对此并不满意,因为它需要我在所有控制器中更改所有 68 的操作。这引入了很多潜在的风险,因为其他功能可能随着我改变这一代码量而改变,因为这些代码在以前版本的Grails中运行良好。我是否可以在全球范围内进行更改以解决此问题?

MyController.groovy

class MyController {
    def myService
    ...
    def myAction() {
        def results = myService.myAction()
        withFormat {
            json { render results as JSON } // <-- MOVED THIS TO BE FIRST
            xml { render results as XML }
        }
    }
    ...        
}

1 个答案:

答案 0 :(得分:0)

根据这篇关于接受标题的文章(http://mrhaki.blogspot.com/2014/07/grails-goodness-enable-accept-header.html),我在Config.groovy中添加了以下行,并更正了我的问题。

<强> Config.groovy中

grails.mime.use.accept.header = true
grails.mime.disable.accept.header.userAgents = [] // <-- Added this line