Im Standardzustand von Spring Boot wird eine Fehlerseite mit dem Namen Whitelabel-Fehlerseite angezeigt, wenn 404 Not Found usw. auftritt.
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon Nov 18 22:16:56 JST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
Um das entsprechende Verhalten mit Curl zu überprüfen, geben Sie im Anforderungsheader mit der Option -H accept: text / html an.
$ curl -H "accept: text/html" http://localhost:8080/
<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Mon Nov 18 22:18:01 JST 2019</div><div>There was an unexpected error (type=Not Found, status=404).</div><div>No message available</div></body></html>
Wenn die Option -H nicht hinzugefügt wird, werden Daten im JSON-Format zurückgegeben.
$ curl http://localhost:8080/
{"timestamp":"2019-11-18T13:19:03.320+0000","status":404,"error":"Not Found","message":"No message available","path":"/"}
In der Spring Boot-Dokumentation wird angegeben, dass der Computerclient eine JSON-Antwort generiert und der Browserclient eine Whitelabel-Fehleransicht generiert, die im HTML-Format angezeigt wird.
Spring Boot Reference Documentation
For machine clients, it produces a JSON response with details of the error, the HTTP status, and the exception message. For browser clients, there is a “whitelabel” error view that renders the same data in HTML format (to customize it, add a View that resolves to error).
Es ist die BasicErrorController-Klasse, die Fehlerseiten in Spring Boot behandelt.
In der errorHtml-Methode der BasicErrorController-Klasse wird in der Annotation @RequestMapping = MediaType.TEXT_HTML_VALUE angegeben.
Daher wird diese errorHtml-Methode aufgerufen, wenn der Accept-Header der Anforderung text / html enthält. Wenn die Anforderung keinen Text / HTML-Code im Accept-Header enthält, wird die Fehlermethode aufgerufen.
Die errorHtml-Methode gibt eine HTML-Antwort zurück, und die error-Methode gibt eine JSON-Antwort zurück.
Der Quellcode des entsprechenden Teils wird unten angezeigt.
spring-boot/BasicErrorController.java at v2.2.1.RELEASE · spring-projects/spring-boot · GitHub
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections
.unmodifiableMap(getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
HttpStatus status = getStatus(request);
if (status == HttpStatus.NO_CONTENT) {
return new ResponseEntity<>(status);
}
Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
return new ResponseEntity<>(body, status);
}
MediaType, eine Klasse, die den Inhaltstyp wie text / html angibt, wird vom Spring Framework bereitgestellt, nicht von Spring Boot.
spring-framework/MediaType.java at v5.2.1.RELEASE · spring-projects/spring-framework · GitHub
/**
* A String equivalent of {@link MediaType#TEXT_HTML}.
*/
public static final String TEXT_HTML_VALUE = "text/html";
Referenz:
Recommended Posts