Ecco la mia formula magica per fare questo. Forse c'è un modo migliore, ma questo funziona e garantisce che la stessa vista 404 restituisca se si genera il 404 o grails lo fa internamente (nessun controller trovato, per esempio).
In primo luogo, creare una vista classe che estende AbstractView:
class NotFoundView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
response.sendError(HttpServletResponse.SC_NOT_FOUND)
}
}
successivo, creare un controller di errore:
class ErrorController {
def notFound = {
return render(view: '/error/notFound')
}
}
ora Crea il tuo vista errore sotto vista/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>
È fondamentale che si utilizza il < g: applyLayout> tag. Se utilizzi il layout, esegui il rendering due volte e annidi da solo.
Ora per la mappatura URL:
"404"(controller: 'error', action: 'notFound')
È tutto pronto ora per inviare che 404 dal controller:
def myAction = {
Thing thing = Thing.get(params.id)
if (!thing) {
return new ModelAndView(new NotFoundView())
}
}
Questo approccio anche permette di registrare facilmente il 404, cercare di risolvilo e invia un 301 o qualunque cosa tu voglia fare.
Lo ho già, ma non capisco come dovrei renderlo quando non riesco a trovare il mio oggetto dominio: 'if (! MyDomainClass.get (params ['i'])) {/ * Allora cosa ...? * /} '. Facendo 'response.sendError (404)' restituisce un '404' bene, ma non rende quella pagina di errore - l'utente vede solo una pagina vuota. –
Ho appena riletto Grails in Action p.331 e afferma che esistono limitazioni alla restituzione dei codici di errore: non è possibile fornire contenuti per la risposta e il tipo di contenuto sarà 'text/html'. Il che non conoscevo e mi confonde ulteriormente ... –
@ Martin ha aggiornato la mia risposta – hvgotcodes