2014-11-20 8 views
5

Cercherò di mantenerlo breve. Ecco il problema che sto provando mentre cercavo di capire i filtri Spark. Sto provando a creare un'app semplice e una delle cose che dovrei fare è creare un rapporto di errore ogni volta che il client sta per vedere un errore http, ad es. 404 o 500. Ecco come il mio app assomiglia:Usa Java Spark dopo il filtro per eseguire un'azione personalizzata quando accade un 404

import static spark.Spark.*; 

public class MyApp { 
    public static void main(String[] args) { 
     get("/hello", (req, res) -> "{\"status\":\"OK\"}"); 

     after((request, response) -> { 
      if (response.raw().getStatus() == 404) { 
       // here run the code that will report the error e.g. 
       System.out.println("An error has occurred!!"); 
      } 
     }); 
    } 
} 

Per qualche ragione, il parametro response ha il suo attributo di stato impostato a 0 quando sto controllando se è impostato a 404. La documentazione dice "after" filters are evaluated after each request and can read the request and read/modify the response così, dovrebbe essere in grado di farlo in qualche modo (a meno che i documenti non siano corretti).

Fondamentalmente, sto cercando di intercettare gli errori http utilizzando un filtro after ma quando provo a verificare la risposta non ottengo quello che mi aspetto.

Qualcuno ha un'idea di quale sarebbe un modo diverso di fare la stessa cosa o come farlo funzionare?

Grazie.

risposta

6

Ho risolto questo utilizzando percorsi con caratteri jolly. Invece di chiamare il metodo after, ho aggiunto una route per ciascuno dei metodi HTTP che associa la route "*".

È importante averli nella parte inferiore del metodo Main in modo che se non viene risolto alcun percorso questi vengono sempre attivati.

Ecco un esempio:

import static spark.Spark.*; 

public class MyApp { 
    public static void main(String[] args) { 
     get("/hello", (req, res) -> "{\"status\":\"OK\"}"); 

     get("*", (request, response) -> { 
      System.out.println("404 not found!!"); 
      // email me the request details ...  
     ); 
    } 
} 
+2

In questo modo si elimina il caricamento di file statici –

+0

No, non lo farà, @KenBlock. Spark attraversa tutti i gestori di risorse prima di eseguire i percorsi. Se viene trovata una risorsa interna/esterna, Spark la restituirà e restituirà. Questo può essere visto in spark.servlet.SparkFilter.doFilter https://github.com/perwendel/spark/blob/master/src/main/java/spark/servlet/SparkFilter.java#L109 –

+0

@TravisSpencer mi uccide caricamento di file statici ... ma gli 404 funzionano ... così vicini ... hai un esempio funzionante? –

1

Il modo preferito per ottenere ciò che si sta cercando sarebbe simile a questa.

get("/hello", (request, response) -> { 
    // look up your resource using resourceId in request/path/query 
    // oh dear, resource not found 
    throw new NotFoundException(resourceId); 
}); 

exception(NotFoundException.class, (e, request, response) -> { 
    response.status(404); 
    response.body(String.format("Resource {%s} not found", e.getResourceId())); 
    // doReporting here. 
}); 

public class NotFoundException extends Exception { 
    private final String resourceId; 
    public NotFoundException(String resourceId) { 
     this.resourceId = resourceId; 
    } 

    public String getResourceId() { 
     return resourceId; 
    } 
} 
+0

qual è la sintassi del codice reale per l'utilizzo di un resourceId ... non riesco a trovare che nella documentazione –

+0

ResourceId e la classe Exception specifica del dominio NotFoundException sia specifica per il tuo dominio, non per Spark-Java. –

+0

Ciò che è specifico di Spark-Java è il paradigma di eccezione, che consente una risposta coerente per ogni tipo di eccezione. L'unico dibattito sarebbe questo un buon uso delle eccezioni; cioè, la risorsa non viene trovata un caso eccezionale o è una risposta attesa. –

Problemi correlati