在Grails控制器操作中处理无效ID的最佳方法是什么?
当MyDomainClass.get(params['i'])
在我的控制器操作中返回null时,我希望用户看到我的自定义“未找到”页面,并且要返回404 HTTP响应代码 - 我无法找出最干净的方法此
感谢。
答案 0 :(得分:8)
我在我的控制器中使用了以下内容,其中'notFound'是自定义404页面:
def show = {
def referenceData = ReferenceData.get( params.id )
if (referenceData)
{ return [ referenceData : referenceData ] }
else
{ redirect(uri:'/notFound') }
}
我还在UrlMapping.groovy中映射了自定义错误页面,例如
static mappings = {
"403"(controller: "errors", action: "forbidden")
"404"(controller: "errors", action: "notFound")
"500"(controller: "errors", action: "serverError")
}
或
static mappings = {
"403"(view: "/errors/forbidden")
"404"(view: "/errors/notFound")
"500"(view: "/errors/serverError")
}
答案 1 :(得分:4)
render status: 404
或
render view: you_not_found_view
或两者(在一次渲染调用中)。
答案 2 :(得分:0)
这是我做这件事的神奇公式。也许有更好的方法,但是这个可以工作并确保相同的404视图呈现您是否生成404或grails在内部执行(例如,没有找到控制器)。
首先,创建一个扩展AbstractView的View类:
class NotFoundView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
response.sendError(HttpServletResponse.SC_NOT_FOUND)
}
}
接下来,创建一个错误控制器:
class ErrorController {
def notFound = {
return render(view: '/error/notFound')
}
}
现在在views / error / notFound.gsp:
下创建错误视图<g:applyLayout name="main">
<!doctype html>
<html>
<head>
<title>Oops! Not found!</title>
</head>
<body>
<h1>Not Found</h1>
<section id="page-body">
<p>Nothing was found at your URI!</p>
</section>
</body>
</html>
</g:applyLayout>
至关重要您使用&lt; g:applyLayout&gt;标签。如果你使用你的布局将渲染两次并嵌套自己。
现在进行URL映射:
"404"(controller: 'error', action: 'notFound')
您现在已全部设置为从控制器发送404:
def myAction = {
Thing thing = Thing.get(params.id)
if (!thing) {
return new ModelAndView(new NotFoundView())
}
}
这种方法还可以让您轻松记录404,尝试解决它并发送301或任何您想要做的事情。