我写了一个grails应用程序,在UrlMappings.groovy文件中我有url映射为
"500"(controller:"exception" , action:"internalServerError")
,所以每当发生任何异常时我都会在ExceptionController中获取异常,但我需要有效负载和引发此异常的url,是否可以获取该数据。
答案 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)
(当500发生时)你应该能够通过
访问原始URLrequest['javax.servlet.error.request_uri']
另外,您可以通过
在每个控制器中获取请求的URLrequest[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
}
}
}
}
}