我的控制器中有一个方法,它向我的GSP发送JSON响应,以便jQuery使用如下:
if (someCondition) {
render(contentType: 'text/json') {
["success": false, "message": "<p>Hello user.</p>"]
}
}
在尝试遵循良好的Grails实践时,我想将此方法转移到服务中以便倾斜控制器代码。我的问题是,如何从服务到控制器获得此响应?它是一个什么样的对象?我需要知道这一点,所以我可以保留它并将其从我的服务交付给我的控制器,然后可以将其发送给GSP。理想情况下,我需要在我的服务中,一个我可以设置的变量等于我刚放入代码框中的变量,但我知道它不是我可以用来保存JSON响应的String类型。那么我可以使用什么呢?
答案 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)
控制器应该负责完成这些任务:
基于此,您的逻辑可以简化如下:
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。