Grails:返回404&显示无效ID的“未找到”页面

时间:2011-01-21 15:45:17

标签: grails

在Grails控制器操作中处理无效ID的最佳方法是什么?

MyDomainClass.get(params['i'])在我的控制器操作中返回null时,我希望用户看到我的自定义“未找到”页面,并且要返回404 HTTP响应代码 - 我无法找出最干净的方法此

感谢。

3 个答案:

答案 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")
}

Grails Docs - mapping to response codes

答案 1 :(得分:4)

编辑 - 我因误读您的问题而道歉。 render方法采用状态代码。所以在控制器中,如果找不到任何内容,请尝试

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或任何您想要做的事情。