【问题标题】:Grails JSON response generated by service to be delivered by controller服务生成的 Grails JSON 响应由控制器传递
【发布时间】:2014-06-06 02:04:06
【问题描述】:

我的控制器中有一个方法,它向我的 GSP 发送 JSON 响应以供 jQuery 使用,如下所示:

if (someCondition) {
    render(contentType: 'text/json') {
        ["success": false, "message": "<p>Hello user.</p>"]
    }
}

在尝试遵循良好的 Grails 实践时,我想将此方法移动到服务中以精简控制器代码。我的问题是,我将如何从服务中获得对控制器的响应?它是一个什么样的物体?我需要知道这一点,以便我可以保存它并将其从我的服务传送到我的控制器,然后控制器可以将它发送到 GSP。理想情况下,我需要在我的服务中设置一个变量,该变量可以设置为等于我刚刚放入代码框中的值,但我知道它不是我可以用来保存 JSON 响应的字符串类型。那我可以用什么?

【问题讨论】:

    标签: jquery json grails


    【解决方案1】:

    您可以使用下面给出的代码来解决您的问题。

    import grails.converters.JSON
     if (someCondition) {
    
        render  ["success": false, "message": "<p>Hello user.</p>"] as JSON
    
    }
    
    And don't forgot to import
    import grails.converters.JSON
    

    【讨论】:

    • 谢谢,我会试试这个。
    【解决方案2】:

    控制器最多应该负责完成以下任务:

    • 收集 http 请求及其参数/请求正文
    • 验证请求
    • 将业务逻辑委托给服务(或实用程序类)
    • 从服务(或实用程序类)收集响应
    • 以请求的格式呈现响应(内容协商)

    基于此,您的逻辑可以简化如下:

    import static org.springframework.http.HttpStatus.*
    
    class MyController {
        def myService
    
        def myAction() {
            // Validate request
    
            // Call service class
            def result = myService.serviceMethod()
    
            //response status code
            def status = result.success ? OK.value() : NOT_FOUND.value() 
    
            // render response
            render(contentType: 'application/json', status: status) { 
                result 
            }
        }
    }
    
    
    //service or any other utility class
    @Transactional
    class MyService {
        def serviceMethod() {
            if( someCondition ) {
                // Return a Map if someCondition statisfies
                // DO NOT put html tags other than in GSPs or message proeperties
                [success: false, "message": "Hello user."]
            } else {
                [success: true, "message": "Hello qualified user."]
            }
        }
    }
    

    另外请注意,服务类默认为 Singleton 和 Transactional,这意味着它跨请求维护状态。在类级别添加的任何属性都将为多个请求维护一个状态,这将导致错误状态。如果服务类中没有预期的数据库写入,则可以通过删除 @Transactional 注释来关闭事务。

    【讨论】:

    • 感谢您一如既往的出色表达和教育性回应。非常感谢。非常感谢和尊重你对我之前帖子的帮助和帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多