2010-11-15 15 views
8

Sto riscontrando qualche problema nell'ottenere Grails per mappare i miei errori 404 a un controller di errori come nella documentazione. Io corro Grails 1.3.5 e quando aggiungo il seguente mappatura per un'applicazione predefinita:Problemi con Grails 404 UrlMapping

"404" (regolatore: 'errori', l'azione: 'NOTFOUND')

Funziona per la mappatura 500 errori ma non 404's. Mi sembra di ricordare di avere questo problema prima e che è collegato a Tomcat (vs Jetty) ma non ricordo una correzione o ho pensato che potrebbe essere stato risolto ormai.

cerco l'accesso a una risorsa che non è definito come http://localhost:8080/appName/controllerName/blah e tutto quello che ottiene è l'impostazione predefinita di Tomcat 404.

sto facendo correre-app uno standard graal per i test e cercando di farlo funzionare.

+0

ora ho provato a riprodurre il problema, in pratica, tuttavia, tutto ciò che ho provato (inoltrare a una vista, inoltrare a controller/azione, run-app, WAR in modalità produzione) ha funzionato come previsto. Puoi fornire un test riproducibile? – robbbert

+0

Il problema non è riproducibile per me (provato molto). - L'interrogante non ha fornito alcun feedback. - Votando la domanda. - Grazie. – robbbert

+0

Breakthough! Sembra funzionare per me se faccio il reindirizzamento nel metodo del controller degli errori, ma non se provo a eseguire il rendering di una pagina. Proverò a configurare un progetto di bitbucket e a caricare un esempio. – ahanson

risposta

8

dopo l'eliminazione spazi bianchi, il problema risolto

"404" (controllore: 'errori', l'azione: 'NOTFOUND')

+0

Sembra una risposta folle, ma ha funzionato anche per me. –

+0

Molto strano. Anche questo risolve il mio problema. Grazie. – ahanson

+2

Vedere questo http://jira.grails.org/browse/GRAILS-7360 – Topera

0

aggiungere il seguente codice a script della tua applicazione/Events.groovy:

import groovy.xml.StreamingMarkupBuilder 

//modify the generated web.xml so that it supports being mapped to 'error' 
eventWebXmlEnd = {String tmpfile -> 
    //find the filter mapping to change 
    String filterNm = "grailsWebRequest" 
    def root = new XmlSlurper().parse(webXmlFile) 
    def gwr = root."filter-mapping".find { it."filter-name" == filterNm } 
    if (!gwr.size()) throw new RuntimeException(
     "[fail] No Filter named $filterNm") 

    // xml is as expected, now modify it and write it back out 
    gwr.appendNode { 
     dispatcher("ERROR") 
    } 
    // webXmlFile is an implicit variable created before event is invoked 
    webXmlFile.text = new StreamingMarkupBuilder().bind { 
     mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee") 
     mkp.yield(root) 
    } 
} 

Vedere this post per una spiegazione. Tieni presente che ho copiato lo script precedente da quella pubblicazione, ma è stato necessario modificarlo perché la struttura web.xml sembra essere cambiata dal momento della scrittura del post.

+0

Mi dispiace, ho sbagliato. - Ho fatto alcuni test effettivi ora e ho scoperto che questo non è necessario con Grails 1.3.5. - L'utilizzo di una mappatura 404 personalizzata ha funzionato per me durante l'inoltro a * view * o a * controller * e * action *. - In pratica, non riesco a riprodurre alcun problema con 404 mapping di URL in Grails. – robbbert