Grails异常处理获取有效负载

时间:2016-08-31 09:23:03

标签: grails grails-2.0 grails-3.0

我写了一个grails应用程序,在UrlMappings.groovy文件中我有url映射为

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

,所以每当发生任何异常时我都会在ExceptionController中获取异常,但我需要有效负载和引发此异常的url,是否可以获取该数据。

2 个答案:

答案 0 :(得分:1)

希望这会有所帮助。此代码直接来自默认的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>

答案 1 :(得分:1)

你的exceptionController中的

(当500发生时)你应该能够通过

访问原始URL
request['javax.servlet.error.request_uri']

另外,您可以通过

在每个控制器中获取请求的URL
request[RequestDispatcher.FORWARD_REQUEST_URI]

用于在消费后访问请求正文,您可以按照建议使用解决方案 Accessing the raw body of a PUT or POST request但请记住,这当然必须保持身体记忆。

在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
                }
            }
        }
    }
}