Aquí está mi fórmula mágica para hacer esto. Tal vez haya una mejor manera, pero esta funciona y garantiza que la misma vista 404 represente si usted genera el 404 o si grial lo hace internamente (no se encontró ningún controlador, por ejemplo).
En primer lugar, crear una clase de vista que se extiende AbstractView:
class NotFoundView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
response.sendError(HttpServletResponse.SC_NOT_FOUND)
}
}
A continuación, cree un controlador de error:
class ErrorController {
def notFound = {
return render(view: '/error/notFound')
}
}
Ahora cree su vista de error en Vistas/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>
Es crucial que utiliza el < g: applyLayout> tag. Si usa su diseño, se renderizará dos veces y se anidará.
Ahora para la asignación de dirección URL:
"404"(controller: 'error', action: 'notFound')
todo ya está listo ahora para enviar que 404 desde su controlador:
def myAction = {
Thing thing = Thing.get(params.id)
if (!thing) {
return new ModelAndView(new NotFoundView())
}
}
Este enfoque también permite fácilmente registrar el 404, intentar Resuélvelo y envía un 301, o lo que quieras hacer.
Ya lo tengo, pero no entiendo cómo se supone que debo renderizarlo cuando no puedo encontrar mi objeto de dominio: 'if (! MyDomainClass.get (params ['i'])) {/ * Y que...? * /} '. Hacer 'response.sendError (404)' devuelve un '404' bien, pero no representa esa página de error, el usuario ve una página en blanco. –
Acabo de volver a leer Grails en acción p.331 y dice que hay limitaciones para devolver los códigos de error: no puede proporcionar contenido para la respuesta y el tipo de contenido será 'text/html'. Que no sabía y me confunde aún más ... –
@martin actualizó mi respuesta – hvgotcodes