Обработка исключений Grails для получения полезной нагрузки

Я написал приложение Grails, в файле UrlMappings.groovy URL-адрес отображается как

"500"(controller:"exception" , action:"internalServerError")

Поэтому, когда бы ни происходило какое-либо исключение, я получал исключение в ExceptionController, но мне нужны полезная нагрузка и URL, который вызвал это исключение. Возможно ли получить эти данные.

2 ответа

Надеюсь это поможет. Этот код прямо из установки Grails по умолчанию

<g:if test="${Throwable.isInstance(exception)}">
            <g:renderException exception="${exception}" />
        </g:if>
        <g:elseif test="${request.getAttribute('javax.servlet.error.exception')}">
            <g:renderException exception="${request.getAttribute('javax.servlet.error.exception')}" />
        </g:elseif>
        <g:else>
            <ul class="errors">
                <li>An error has occurred</li>
                <li>Exception: ${exception}</li>
                <li>Message: ${message}</li>
                <li>Path: ${path}</li>
            </ul>
        </g:else>

В вашем контроллере исключения (когда произошло 500) вы сможете получить доступ к исходному URL через

request['javax.servlet.error.request_uri']

Кроме того, вы можете получить запрошенный URL на каждом контроллере через

request[RequestDispatcher.FORWARD_REQUEST_URI]

для доступа к телу запроса после его использования можно использовать решение, предложенное в разделе "Доступ к необработанному телу запроса PUT или POST", но имейте в виду, что это, конечно, должно держать тело в памяти.

чтобы получить первоначально вызванный контроллер и имя действия внутри вашего exceptionController, единственное решение, которое я знаю сейчас, будет либо:

class ExceptionController {
    def grailsUrlMappingsHolder

    internalServerError() {
        // request['javax.servlet.error.request_uri'] sometimes returns null?
        def url = request['javax.servlet.error.request_uri'] ?: request[RequestDispatcher.FORWARD_REQUEST_URI]
        def originalCall = url ? grailsUrlMappingsHolder.match(request['javax.servlet.error.request_uri'])?.paramss : [:]
        def controller = original?.controller
        def action = original?.action
        ...
    }
}

в качестве альтернативы, сохраняя первый вызов контроллера в таком фильтре:

class SaveFirstCallFilter {
    def filters = {
        all(controller:'*', action:'*') {
            before = {
                // don't want to overwrite when forwarding or including other actions
                if (!request['SAVED_CONTROLLER']) {
                    request['SAVED_CONTROLLER'] = controllerName
                    request['SAVED_CONTROLLER'] = actionName
                }
            }
        }
    }
}
Другие вопросы по тегам