İşte bunu yapmak için benim sihirli formülü. Belki de daha iyi bir yol var, ama bu da çalışıyor ve aynı 404 görünümü, dahili olarak 404 ya da grails üretip üretmediğinizi sağlıyor (örneğin, kontrolör bulunamadı).
Birincisi, AbstractView uzanan Görünüm sınıf oluşturmak:
class ErrorController {
def notFound = {
return render(view: '/error/notFound')
}
}
Şimdi görünümler altında hata görünüm oluşturmak/hata/notFound.gsp:
class NotFoundView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
response.sendError(HttpServletResponse.SC_NOT_FOUND)
}
}
Sonraki bir hata denetleyicisi oluşturmak
<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>
çok önemlidir 01 kullanıyorsunuzg: applyLayout> etiketi. Düzeninizi kullanırsanız, düzeninizi iki kez oluşturur ve yuvaya yerleştirir.
"404"(controller: 'error', action: 'notFound')
Hepiniz denetleyicinizdeki gelen 404 olduğunu göndermek için şimdi hazırsınız: URL eşlemesi için Şimdi
def myAction = {
Thing thing = Thing.get(params.id)
if (!thing) {
return new ModelAndView(new NotFoundView())
}
}
Bu yaklaşım aynı zamanda kolayca 404 log sağlar, deneyin Çöz ve 301 ya da ne yapmak istersen yolla.
Bunu zaten yaptım, ancak etki alanı nesnesini bulamadığım halde nasıl render edeceğimi anlamadım: if if! (MyDomainClass.get (params ['i'])) {/ * Sonra ne...? * /} '. Response.sendError (404) işlevi "404" değerini döndürür, ancak bu hata sayfasını oluşturmaz - kullanıcı sadece boş bir sayfa görür. –
Sadece Grails in Action p.331 ve geri dönen hata kodları için sınırlamalar olduğunu söylüyor - yanıt için içerik sağlayamıyorsunuz ve içerik türü "text/html" olacaktır. Bilmiyordum ve beni daha fazla karıştırıyor ... –
@martin benim cevabını güncelledi – hvgotcodes