2014-11-20 4 views
5

Ich werde versuchen, es kurz zu halten. Hier ist das Problem, das ich habe, wenn ich versuche, Spark-Filter zu verstehen. Ich versuche, eine einfache App zu erstellen, und eines der Dinge, die es tun sollte, ist, einen Fehlerbericht jedes Mal zu erstellen, wenn der Client einen http-Fehler z. Hier 404 oder 500 ist, wie meine app aussieht:Verwenden Sie Java Spark nach Filter, um benutzerdefinierte Aktion auszuführen, wenn ein 404 passiert

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!!"); 
      } 
     }); 
    } 
} 

Aus irgendeinem Grund der response Parameter seinen Status-Attribut auf 0 gesetzt ist, wenn ich überprüft, ob es auf 404. Set Die Dokumentation sagt "after" filters are evaluated after each request and can read the request and read/modify the response so, ich sollte in der Lage sein, es irgendwie zu tun (außer die Dokumente sind falsch).

Grundsätzlich versuche ich http Fehler mit einem after Filter abzufangen, aber wenn ich versuche, die Antwort zu überprüfen, bekomme ich nicht, was ich erwarte.

Hat jemand eine Idee, was wäre eine andere Art und Weise, die gleiche Sache zu tun oder wie dies funktioniert?

Danke.

Antwort

6

Ich löste dieses mit Wildcard-Routen. Anstatt die Methode after aufzurufen, habe ich eine Route für jede HTTP-Methode hinzugefügt, die die Route "*" bindet.

Es ist wichtig, sie am Ende der Main Methode zu haben. Wenn also keine Route gelöst wird, werden diese immer ausgelöst.

Hier ist ein Beispiel:

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

Auf diese Weise wird statische Datei laden –

+0

Nein, wird es nicht, @KenBlock. Spark durchläuft alle Ressourcenhandler, bevor die Routen ausgeführt werden. Wenn eine interne/externe Ressource gefunden wird, wird sie von Spark ausgegeben und zurückgegeben. Dies kann in spark.servlet.SparkFilter.doFilter gesehen werden https://github.com/perwendel/spark/blob/master/src/main/java/spark/servlet/SparkFilter.java#L109 –

+0

@TravisSpencer es tötet meine statische Datei wird geladen ... aber die 404er funktionieren ... so nah ... hast du ein funktionierendes Beispiel? –

1

Die bevorzugte Art und Weise zu erreichen, was Sie suchen würde wie folgt aussehen.

+0

whats die tatsächliche Code-Syntax für die Verwendung einer RessourceId ... Ich kann nicht finden, dass in der Dokumentation –

+0

ResourceId und die domänenspezifische Exception-Klasse NotFoundException ist spezifisch für Ihre Domäne, nicht Spark-Java. –

+0

Spezifisch für Spark-Java ist das Exception-Paradigma, das eine konsistente Antwort für jeden Ausnahmetyp ermöglicht. Die einzige Debatte wäre, dass die Ausnahmen gut genutzt werden; Das heißt, ist Ressource nicht ein Ausnahmefall gefunden oder ist es eine erwartete Antwort. –

Verwandte Themen