Обработка исключений 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
}
}
}
}
}