我想写一个Grails REST控制器,它应始终JSON回应响应。所述控制器被如下所示:Grails的REST控制器,具有不正确的内容类型
class TimelineController {
static allowedMethods = [index: "GET"]
static responseFormats = ['json']
TimelineService timelineService
def index(TimeLineCommand command) {
List<TimelineItem> timeline = timelineService.currentUserTimeline(command)
respond timeline
}
}
我使用respond
方法,该方法是Grails的REST支撑部,所以内容协商用于找出呈现什么类型的响应。在这种特殊情况下我希望JSON被选中,是因为控制器指定
static responseFormats = ['json']
而且我已经写了(和注册与Spring)以下渲染器自定义要返回的List<TimelineItem>
class TimelineRenderer implements ContainerRenderer<List, TimelineItem> {
@Override
Class<List> getTargetType() {
List
}
@Override
Class<TimelineItem> getComponentType() {
TimelineItem
}
@Override
void render(List timeline, RenderContext context) {
context.contentType = MimeType.JSON.name
def builder = new JsonBuilder()
builder.call(
[items: timeline.collect { TimelineItem timelineItem ->
def domainInstance = timelineItem.item
return [
date: timelineItem.date,
type: domainInstance.class.simpleName,
item: [
id : domainInstance.id,
value: domainInstance.toString()
]
]
}]
)
builder.writeTo(context.writer)
}
@Override
MimeType[] getMimeTypes() {
[MimeType.JSON] as MimeType[]
}
}
我已经写了一些功能测试,并且可以看到,虽然我的渲染器调用,在解决内容类型是text/html
,所以控制器返回404,因为它无法找到一个GSP与预期的名称。
我强烈怀疑这个问题与使用自定义渲染器有关,因为我有另一个几乎完全相同的控制器,它不使用自定义渲染器,并且它正确解析了内容类型。
Accept'header设置为'application/json'吗? – dmahapatro
@dmahapatro我不想使用Accept标头来解析内容,我总是**想要返回JSON。我认为加'静态responseFormats = [“JSON”]'控制器应确保此 –
你能否阐述一下为什么你真的想使用'respond'在所有的一点点?当你不使用不同的MIME类型时,你可以根本不使用'respond'方法,而是使用'render myList as JSON'来代替? –