2014-11-20 43 views
5

我會盡量保持簡短。以下是我在嘗試理解Spark過濾器時遇到的問題。我試圖創建一個簡單的應用程序,它應該做的一件事是每當客戶端即將看到http錯誤時創建錯誤報告,例如當如果它被設置爲404。我檢查文檔說"after" filters are evaluated after each request and can read the request and read/modify the response所以,我使用Java Spark過濾後,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!!"); 
      } 
     }); 
    } 
} 

出於某種原因,response參數有其狀態屬性設定爲0:404或500。這裏是我的應用程序看起來像應該能夠以某種方式做到這一點(除非文檔錯誤)。

基本上,我試圖攔截HTTP錯誤使用after篩選器,但是當我嘗試檢查響應時,我沒有得到我所期望的。

有沒有人有一個想法什麼會做不同的方式做同樣的事情或如何使這項工作?

謝謝。

回答

6

我使用通配符路徑解決了這個問題。我沒有調用after方法,而是爲每個綁定「*」路由的HTTP方法添加一個路由。

將它們放在Main方法的底部很重要,所以如果沒有路線被解決,這些路徑總是會被觸發。

下面是一個例子:

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

這種方式會殺死靜態文件加載 – 2015-10-16 18:58:30

+0

不,它不會@KenBlock。 Spark在運行路由之前通過所有資源處理程序進行循環。如果找到內部/外部資源,Spark將輸出並返回。這可以看出spark.servlet.SparkFilter.doFilter https://github.com/perwendel/spark/blob/master/src/main/java/spark/servlet/SparkFilter.java#L109 – 2015-10-25 14:44:29

+0

@TravisSpencer它殺死我的靜態文件加載...但404的工作...如此接近...你有一個工作的例子嗎? – 2016-05-26 18:03:32

1

的首選方式來實現你所尋找的是這樣的。

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

什麼是使用resourceId的實際代碼語法...我無法在文檔中找到 – 2016-05-25 06:00:53

+0

ResourceId和特定於域的Exception類NotFoundException是特定於您的域的,而不是Spark-Java。 – 2016-05-25 13:51:30

+0

Spark-Java的具體特性是異常範例,它允許爲每種類型的異常提供一致的響應。唯一的辯論是這是一個很好的例外使用;也就是說,沒有發現資源是例外情況,還是預期的迴應。 – 2016-05-25 13:53:45

相關問題