2013-11-01 2 views
5

Qualcuno sa come ignorare la pagina di errore 402 esistente quando si utilizza Spark framework micro-web?SparkJava pagina di errore personalizzata

La pagina di errore di default è:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/> 
<title>Error 404 </title> 
</head> 
<body> 
<h2>HTTP ERROR: 404</h2> 
<p>Problem accessing /strangepage. Reason: 
<pre> Not Found</pre></p> 
<hr /><i><small>Powered by Jetty://</small></i> 
</body> 
</html> 

Voglio modificare questo personalizzato pagina di errore (o forse reindirizzare ad un altro percorso):

get(new Route("/404") { 
    @Override 
    public Object handle(Request request, Response response) { 
     response.type("text/html"); 
     return "Error page 404"; 
    } 
}); 

risposta

2

se si distribuisce la tua app su un server web che potresti mappare un errore su una scintilla.

<filter> 
    <filter-name>SparkFilter</filter-name> 
    <filter-class>spark.servlet.SparkFilter</filter-class> 
    <init-param> 
     <param-name>applicationClass</param-name> 
     <param-value>com.company.YourApplication</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>SparkFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

<error-page> 
    <error-code>404</error-code> 
    <location>/404</location> <!-- this is your route--> 
</error-page> 
0

Penso che sia possibile utilizzare un filtro Spark. Per filtrare le rotte che non sono consentite. È possibile eseguire il rendering di un nuovo modello nel filtro.

Questo è un esempio dei documenti.

before(new Filter() { // matches all routes 
    @Override 
    public void handle(Request request, Response response) { 
     boolean authenticated; 
     // ... check if authenticated 
     if (!authenticated) { 
      halt(401, "You are not welcome here"); 
     } 
    } 
}); 
+0

il problema è la "directory pubblica". È impossibile filtrare ogni percorso url perché public dir (che lancia la pagina di errore 408 di Jetty). – dns

3

tenta di utilizzare questa punta di seguito

Aggiungere queste righe subito dopo ultimo percorso a causa della scintilla si preoccupa di ordine

Spark.get("*", (req, res) -> {  
    if(!req.pathInfo().startsWith("/static")){ 
     res.status(404); 
     return TEMPLATE_ENGINE.render(ModelAndView modelAndView); 
    } 
    return null; 
}); 

Tutti richiesta (richiesta includono statica) non corrisponde tutti i percorsi superiori quale sarà catturato qui. In questo modo, devi separare strane richieste e richieste statiche con l'istruzione IF. Dovresti restituire la tua pagina html di errore come stringa qui.

Tutte le richieste statiche sono gestite da un altro gestore e si deve restituire NULL per forzare Spark a chiamare un altro gestore come nel caso normale.

+0

Errore: (214, 35) java: le espressioni lambda non sono supportate in -source 1.6 (utilizzare -sorgente 8 o superiore per abilitare espressioni lambda) – dns

+0

Quando cambio obiettivo su 8, restituisce: Errore: java: javacTask: source release 8 richiede versione target 1.8 – dns

+0

Devo ricostruire tutta la dipendenza esterna (come Jetty, servlet, freemarker, slf4j, spark-core) a 1.8? – dns

1

In Spark 2.3 documentazione:

get("/throwexception", (request, response) -> { 
    throw new NotFoundException(); 
}); 

exception(NotFoundException.class, (e, request, response) -> { 
    response.status(404); 
    response.body("Resource not found"); 
}); 

ho scoperto che invece di "/ ThrowException", "/ *" viene tutto non trovato pagine. Questo potrebbe non funzionare se hai una struttura url più complicata di quella che sto facendo. Non sono stato in grado di risolvere NotFoundException nel mio progetto, quindi penso che sia possibile creare una propria eccezione o crearne una integrata.

1

Per coloro che vogliono gestire tutte le eccezioni e visualizzare di nuovo il messaggio di errore, ecco un modo semplice per dichiarare il gestore:

exception(Exception.class, exceptionHandler()); 

e poi una semplice implementazione:

private ExceptionHandler exceptionHandler() { 
    return (e, req, res) -> { 
     res.status(500); 
     res.body("<h1>Exception occurred</h1><div>" + e.getMessage() + "</div>"); 
    }; 
}