Grails: как обслуживать разные ответы на ошибку 500 в зависимости от формата (JSON, HTML)?

Я пытаюсь обслуживать разные ответы в Grails, когда возникает ошибка 500 в зависимости от формата запроса.

Я создал ErrorController и использую его в URLMappings, но не получаю правильный формат запроса:

def handle() {
    withFormat {
        html {
            response.status = 500
            render(view:'/errors/serverError')
        }
        json {
            response.setContentType "application/json; charset=utf-8"
            response.status = 500
            ApiResponse apiResponse = new ApiResponse(
                meta: new ApiMeta(
                    code: 500,
                    errorType: "Whatever",
                    msgs: ["${request.exception}"]
                )
            )
            render apiResponse as JSON
    }
    }
}

Ответ всегда в html. Также пробовал с «request.withFormat» с теми же результатами.

Что мне здесь не хватает?


person chozero    schedule 22.09.2012    source источник
comment
+1 Я тоже пытался понять это ;( Также я хочу иметь возможность создавать темы на 500 страниц   -  person chrislovecnm    schedule 22.09.2012


Ответы (2)


У меня недостаточно информации, чтобы проверить, действительно ли это причина, но это может выглядеть как проблема с типом MIME. Правильно ли настроен json как тип MIME в вашем Config.groovy? Ваш клиент принимает ваш тип MIME. См. эту ссылку для справки: http://grails.org/doc/2.1.0/guide/single.html#contentNegotiation

person John Doppelmann    schedule 23.09.2012
comment
JSON включен как MIME в Config.groovy (Grails 2.1.1): json: ['application/json','text/json'], Также мне удалось определить формат в других действиях контроллера. - person chozero; 24.09.2012
comment
Это действительно было связано с типом MIME. Я не принимал формат в заголовке Accept. Я изменил «grails.mime.use.accept.header» на true в Config.groovy, и он работает. - person chozero; 02.10.2012

Я не уверен, что это может решить вашу проблему... но попробуйте обработку ошибок в URLMapping, как показано в http://grails.org/doc/latest/guide/theWebLayer.html#mappingToResponseCodes

Вы можете поймать любое исключение из своих действий и выдать исключение как JSONException, когда запрос формата - JSON.

"500"(controller: "error", action: "handleJsonException", exception: JSONException)
"500"(controller: "error", action: "handleHtmlException")
person semurat    schedule 30.09.2012
comment
Я пробовал это решение, но оно не сработало. Добавление обработчика для JSONException будет работать, но только в том случае, если пойманное исключение относится к этому типу, например к ошибке синтаксического анализа. Спасибо, в любом случае :) - person chozero; 02.10.2012