2017-02-20 100 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消息。