2017-02-20 106 views
1

我想知道爲什麼Spring Boot處理404 Not Found的方式不同。爲什麼Spring Boot爲不同的實體處理「404 Not Found」?

無現有路徑例如

我做一個沒有現有的路徑上,捲曲的請求:與瀏覽器

$ curl -v -H "Authorization: Basic YWRtaW46YWRtaW4xMjM=" http://localhost:8080/no/endpoint | python -m json.tool 
* Adding handle: conn: 0x69aa30 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x69aa30) send_pipe: 1, recv_pipe: 0 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
    0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0* About to connect() to localhost port 8080 (#0) 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 8080 (#0) 
> GET /no/endpoint HTTP/1.1 
> User-Agent: curl/7.33.0 
> Host: localhost:8080 
> Accept: */* 
> Authorization: Basic YWRtaW46YWRtaW4xMjM= 
> 
< HTTP/1.1 404 
< Set-Cookie: JSESSIONID=62B5B02F18842F3BD46BCE57F2EAB017;path=/;HttpOnly 
< X-Application-Context: Rechnungsservice Gateway:dev 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: 0 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Mon, 20 Feb 2017 11:59:19 GMT 
< 
{ [data not shown] 
100 115 0 115 0  0 569  0 --:--:-- --:--:-- --:--:-- 614 
* Connection #0 to host localhost left intact 
{ 
    "error": "Not Found", 
    "message": "No message available", 
    "path": "/no/endpoint", 
    "status": 404, 
    "timestamp": 1487591959599 
} 

同樣的操作: enter image description here

現在我要求無現有實體的端點:

在瀏覽器
$ curl -v -H "Authorization: Basic YWRtaW46YWRtaW4xMjM=" http://localhost:8080/api/v1/settings/123 | python -m json.tool                              

* Adding handle: conn: 0x62aa40                      
* Adding handle: send: 0                        
* Adding handle: recv: 0                        
* Curl_addHandleToPipeline: length: 1                     
* - Conn 0 (0x62aa40) send_pipe: 1, recv_pipe: 0                  
    % Total % Received % Xferd Average Speed Time Time  Time Current          
           Dload Upload Total Spent Left Speed           
    0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0* About to connect() to localhost port 8 
080 (#0)                            
* Trying 127.0.0.1...                        
* Connected to localhost (127.0.0.1) port 8080 (#0)                 
> GET /api/v1/settings/123 HTTP/1.1                     
> User-Agent: curl/7.33.0                        
> Host: localhost:8080                         
> Accept: */*                           
> Authorization: Basic YWRtaW46YWRtaW4xMjM=                   
>                              
< HTTP/1.1 404                           
< Set-Cookie: JSESSIONID=BCD5ADDA48EB03C235E6573A36860F7D;path=/;HttpOnly            
< X-Application-Context: Rechnungsservice Gateway:dev                 
< X-Content-Type-Options: nosniff                      
< X-XSS-Protection: 1; mode=block                      
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate              
< Pragma: no-cache                          
< Expires: 0                           
< Content-Length: 0                         
< Date: Mon, 20 Feb 2017 12:05:29 GMT                     
<                              
    0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0           
* Connection #0 to host localhost left intact                   
No JSON object could be decoded  

同樣的操作: enter image description here

所以我的問題是:爲什麼春天開機只有在沒有找到實體的情況下發送一個簡單的404個狀態?我希望看到一個很好的消息:在我的錯誤頁面上找不到類似於實體的文本或text/html或json錯誤對象(如果發生json請求)...對於路徑示例,它的工作方式類似於該框...

我正在使用Spring Boot 1.4.3.RELEASE。

UPDATE: 對不起,我忘了說,我用Spring數據休息。 在這裏,我調試unti我發現這個代碼片段:

class RepositoryEntityController ... { 

public ResponseEntity<Resource<?>> getItemResource(...) { 

Object domainObj = getItemResource(resourceInformation, id); 

    if (domainObj == null) { 
     return new ResponseEntity<Resource<?>>(HttpStatus.NOT_FOUND); 
    } 

} 

在我看來,不存在應該拋出一個「NotFoundException」,從而更好地應對單個實體的請求。

回答

2

第一個請求永遠不會到達您的Spring應用程序,您的WAR沒有在該位置部署,所以您可以從Web服務器(也許是Tomcat)獲得通用的404消息。