Próbuję napisać kontroler REST Grails, który powinien zawsze odpowiadać JSON. Sterownik znajduje się poniżej:Kontroler REST Grailsa odpowiada nieprawidłowym typem zawartości
class TimelineController {
static allowedMethods = [index: "GET"]
static responseFormats = ['json']
TimelineService timelineService
def index(TimeLineCommand command) {
List<TimelineItem> timeline = timelineService.currentUserTimeline(command)
respond timeline
}
}
Używam metody respond
który jest częścią wsparcia REST Grails', negocjacje więc treść jest używany, aby dowiedzieć się, jaki rodzaj odpowiedzi do renderowania. W tym konkretnym przypadku spodziewałbym JSON zostać wybrany, ponieważ kontroler określa
static responseFormats = ['json']
Ponadto pisałem (i zarejestrowane wiosną) Poniższy renderujący, aby dostosować format JSON, który jest zwracany do 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[]
}
}
pisałem kilka testów funkcjonalnych i widać, że chociaż moja renderujący jest wywoływana, rozdzielonych typu treści text/html
, więc kontroler zwraca 404, ponieważ nie może znaleźć GSP z oczekiwanym nazwy.
Podejrzewam, że problem jest związany z korzystaniem z niestandardowego renderera, ponieważ mam inny prawie identyczny kontroler, który nie używa niestandardowego renderera i poprawnie rozpoznaje typ zawartości.
Czy nagłówek 'Accept' jest ustawiony na' application/json'? – dmahapatro
@dmahapatro Nie chcę używać nagłówka 'Accept' dla rozdzielczości treści, ** zawsze ** chcę zwrócić JSON. Pomyślałem, że dodanie 'static responseFormats = ['json']' do kontrolera powinno zapewnić to –
Czy mógłbyś trochę wyjaśnić, dlaczego właściwie chcesz w ogóle używać 'odpowiedzi'? Kiedy nie używasz różnych typów MIME, możesz w ogóle pozbyć się metody 'reply' i zamiast niej użyć' render myList jako JSON'? –