我想寫一個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'來代替? –