服务生成的Grails JSON响应由控制器提供

时间:2014-06-06 02:04:07

标签: jquery json grails

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

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

在尝试遵循良好的Grails实践时,我想将此方法转移到服务中以便倾斜控制器代码。我的问题是,如何从服务到控制器获得此响应?它是一个什么样的对象?我需要知道这一点,所以我可以保留它并将其从我的服务交付给我的控制器,然后可以将其发送给GSP。理想情况下,我需要在我的服务中,一个我可以设置的变量等于我刚放入代码框中的变量,但我知道它不是我可以用来保存JSON响应的String类型。那么我可以使用什么呢?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

控制器应该负责完成这些任务:

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

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

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,这意味着它会跨请求维护状态。在类级别添加的任何属性将保持多个请求的状态,这将导致错误的状态。如果服务类中没有预期的db写入,则可以通过删除@Transactional注释来关闭Transactional。