Dans l'état par défaut de Spring Boot, une page d'erreur appelée Page d'erreur Whitelabel s'affiche lorsque 404 Not Found etc. se produit.
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
Pour vérifier le comportement équivalent avec curl, spécifiez accept: text / html dans l'en-tête de la requête avec l'option -H.
$ 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>
Si l'option -H n'est pas ajoutée, les données au format JSON seront renvoyées.
$ curl http://localhost:8080/
{"timestamp":"2019-11-18T13:19:03.320+0000","status":404,"error":"Not Found","message":"No message available","path":"/"}
La documentation Spring Boot indique que le client de la machine générera une réponse JSON et que le client du navigateur générera une vue d'erreur de marque blanche à afficher au format HTML.
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).
C'est la classe BasicErrorController qui gère les pages d'erreur dans Spring Boot.
Dans la méthode errorHtml de la classe BasicErrorController, produit = MediaType.TEXT_HTML_VALUE est spécifié dans l'annotation @RequestMapping.
Par conséquent, cette méthode errorHtml est appelée lorsque l'en-tête Accept de la demande contient du texte / html. Si la demande n'inclut pas de texte / html dans l'en-tête Accept, la méthode d'erreur est appelée.
La méthode errorHtml renvoie une réponse HTML et la méthode error renvoie une réponse JSON.
Le code source de la partie concernée est indiqué ci-dessous.
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, une classe qui indique le type de contenu comme text / html, est fournie par Spring Framework, et non par 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";
référence:
Recommended Posts