के साथ प्रतिक्रिया करता है मैं एक 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 'बाकी समर्थन का हिस्सा है का उपयोग कर रहा है, तो सामग्री बातचीत पता लगाने की प्रतिक्रिया किस प्रकार प्रस्तुत करना करने के लिए प्रयोग किया जाता है। इस विशेष मामले में मैं JSON चुना जाना उम्मीद होती है क्योंकि नियंत्रक निर्दिष्ट करता
static responseFormats = ['json']
इसके अलावा मैं लिखा है (और पंजीकृत वसंत के साथ) निम्नलिखित रेंडरर JSON कि 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 देता है क्योंकि यह उम्मीद नाम के साथ एक जीएसपी नहीं मिल रहा।
मैं दृढ़ता से संदेह समस्या एक कस्टम रेंडरर के उपयोग से संबंधित है, क्योंकि मैं एक और लगभग समान नियंत्रक जो एक कस्टम रेंडरर का उपयोग नहीं करता है और इसे सही ढंग से सामग्री प्रकार हल करता है।
'स्वीकार करें' हेडर सेट 'एप्लिकेशन/जेसन'' है? – dmahapatro
@dmahapatro मैं सामग्री संकल्प के लिए 'स्वीकार करें' शीर्षलेख का उपयोग नहीं करना चाहता, मैं ** हमेशा ** JSON वापस करना चाहता हूं। मैंने सोचा कि नियंत्रक को 'स्थिर प्रतिक्रिया Formats = ['json'] 'जोड़ना चाहिए यह –
यह सुनिश्चित करना चाहिए कि आप वास्तव में' प्रतिक्रिया 'का उपयोग क्यों करना चाहते हैं? जब आप विभिन्न माइम प्रकारों का उपयोग नहीं करते हैं, तो आप 'प्रतिक्रिया' विधि से छुटकारा पा सकते हैं, और 'myList को JSON' के रूप में प्रस्तुत करना' का उपयोग कर सकते हैं? –