[JAVA] À partir de Spring Boot 2.3, la page d'erreur par défaut ne contient plus d'informations détaillées sur l'erreur

Aperçu

--Depuis Spring Boot 2.3, la réponse d'erreur par défaut (page d'erreur HTML et erreur JSON) ne contient plus de messages d'erreur ou d'erreurs de liaison. Il s'agit d'une mesure pour empêcher que des informations d'erreur involontaires ne soient renvoyées dans la réponse.

Sortie des éléments vers la page d'erreur HTML et erreur JSON

[DefaultErrorAttributes \ (Spring Boot 2 \ .3 \ .0 \ .RELEASE API )](https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/api/org/springframework/boot Les éléments à afficher sont décrits dans /web/servlet/error/DefaultErrorAttributes.html).

--Timelink: heure à laquelle l'erreur a été extraite --status: code d'état --error: raison de l'erreur --exception: nom de la classe d'exception racine --message: message d'exception --errors: Plusieurs ObjectErrors (binding-errors) définis dans BindingResult --trace: trace de pile d'exception --path: chemin de l'URL lorsqu'une exception se produit

Propriétés des paramètres

La présence ou l'absence de sortie peut être contrôlée en définissant les valeurs de server.error.include-message (message) et server.error.include-binding-errors dans application.properties.

Spring Boot 2.3 Release Notes · spring-projects/spring-boot Wiki · GitHub

Changes to the Default Error Page’s Content The error message and any binding errors are no longer included in the default error page by default. This reduces the risk of leaking information to a client. server.error.include-message and server.error.include-binding-errors can be used to control the inclusion of the message and binding errors respectively. Supported values are always, on-param, and never.

--server.error.include-message (contrôle la sortie des éléments de message) --server.error.include-binding-errors (contrôle la sortie des éléments d'erreurs) --server.error.include-stacktrace (contrôle la sortie des éléments de trace) --server.error.include-exception (contrôle la sortie des éléments d'exception)

Exemple de sortie d'erreur

Voici quelques exemples de réponses d'erreur avec quelques modèles de réglage. Le HTML et le JSON répertoriés sont formatés pour la lisibilité.

Spring Boot 2.2

Si vous ne spécifiez rien dans application.properties. Dans Spring Boot 2.2, le message et les erreurs sont affichés même si rien n'est spécifié.

JSON

{
  "timestamp": "2020-07-19T06:14:27.622+0000",
  "status": 400,
  "error": "Bad Request",
  "errors": [
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "Erreur foo générée artificiellement",
      "objectName": "fooError",
      "code": null
    },
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "Erreur de barre générée artificiellement",
      "objectName": "barError",
      "code": null
    }
  ],
  "message": "Validation failed for object='fooBarData'. Error count: 2",
  "path": "/json"
}

HTML

<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'>Sun Jul 19 15:14:30 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div>Validation failed for object=&#39;fooBarData&#39;. Error count: 2</div>
</body></html>

Spring Boot 2.3

Si vous ne spécifiez rien dans application.properties. Il est configuré pour ne pas fournir d'informations détaillées sur les erreurs.

JSON

{
  "timestamp": "2020-07-19T06:13:46.546+00:00",
  "status": 400,
  "error": "Bad Request",
  "message": "",
  "path": "/json"
}

HTML

<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'>Sun Jul 19 15:13:48 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div></div>
</body></html>

Spring Boot 2.3 + Spécifiez jamais, faux dans le paramètre de propriété

Lorsque ce qui suit est spécifié dans application.properties. Il est configuré pour ne pas fournir d'informations détaillées sur les erreurs.

server.error.include-message=never
server.error.include-binding-errors=never
server.error.include-stacktrace=never
server.error.include-exception=false

JSON

{
  "timestamp": "2020-07-19T06:13:18.720+00:00",
  "status": 400,
  "error": "Bad Request",
  "message": "",
  "path": "/json"
}

HTML

<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'>Sun Jul 19 15:13:22 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div></div>
</body></html>

Spring Boot 2.3 + toujours, true spécifié dans le paramètre de propriété

Lorsque ce qui suit est spécifié dans application.properties. Il est configuré pour afficher des informations d'erreur détaillées.

server.error.include-message=always
server.error.include-binding-errors=always
server.error.include-stacktrace=always
server.error.include-exception=true

JSON

{
  "timestamp": "2020-07-19T06:11:54.165+00:00",
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.validation.BindException",
  "trace": "org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors\n
            Error in object 'fooError': codes []; arguments []; default message [Erreur foo générée artificiellement]\n
            Error in object 'barError': codes []; arguments []; default message [Erreur de barre générée artificiellement]\n\t
            at example.FooBarRestController.json(FooBarRestController.java:20)
            (Omission)
            java.base/java.lang.Thread.run(Thread.java:832)\n",
  "message": "Validation failed for object='fooBarData'. Error count: 2",
  "errors": [
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "Erreur foo générée artificiellement",
      "objectName": "fooError",
      "code": null
    },
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "Erreur de barre générée artificiellement",
      "objectName": "barError",
      "code": null
    }
  ],
  "path": "/json"
}

HTML

<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'>Sun Jul 19 15:11:48 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div>Validation failed for object=&#39;fooBarData&#39;. Error count: 2</div>
<div style='white-space:pre-wrap;'>
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Error in object &#39;fooError&#39;: codes []; arguments []; default message [Erreur foo générée artificiellement]
Error in object &#39;barError&#39;: codes []; arguments []; default message [Erreur de barre générée artificiellement]
	at example.FooBarController.page(FooBarController.java:20)
(Omission)
	at java.base/java.lang.Thread.run(Thread.java:832)
</div>
</body></html>

Où les informations d'erreur sont construites dans le code source de Spring Boot 2.3

La classe DefaultErrorAttributes génère des informations d'erreur à afficher en JSON ou HTML.

spring-boot/DefaultErrorAttributes.java at v2.3.0.RELEASE · spring-projects/spring-boot · GitHub

public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
  Map<String, Object> errorAttributes = new LinkedHashMap<>();
  errorAttributes.put("timestamp", new Date());
  addStatus(errorAttributes, webRequest);
  addErrorDetails(errorAttributes, webRequest, includeStackTrace);
  addPath(errorAttributes, webRequest);
  return errorAttributes;
}

Vous créez le code HTML de la page d'erreur avec la classe ErrorMvcAutoConfiguration.

spring-boot/ErrorMvcAutoConfiguration.java at v2.3.0.RELEASE · spring-projects/spring-boot · GitHub

StringBuilder builder = new StringBuilder();
Date timestamp = (Date) model.get("timestamp");
Object message = model.get("message");
Object trace = model.get("trace");
if (response.getContentType() == null) {
  response.setContentType(getContentType());
}
builder.append("<html><body><h1>Whitelabel Error Page</h1>").append(
    "<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>")
    .append("<div id='created'>").append(timestamp).append("</div>")
    .append("<div>There was an unexpected error (type=").append(htmlEscape(model.get("error")))
    .append(", status=").append(htmlEscape(model.get("status"))).append(").</div>");
if (message != null) {
  builder.append("<div>").append(htmlEscape(message)).append("</div>");
}
if (trace != null) {
  builder.append("<div style='white-space:pre-wrap;'>").append(htmlEscape(trace)).append("</div>");
}
builder.append("</body></html>");

Matériel de référence

Recommended Posts

À partir de Spring Boot 2.3, la page d'erreur par défaut ne contient plus d'informations détaillées sur l'erreur
Spring Boot commençant par copie
Spring Boot à partir de Docker
Je veux contrôler le message d'erreur par défaut de Spring Boot
Erreur Javaw.exe lors du démarrage de Spring Boot (STS)
Page d'erreur Spring Boot Whitelabel et réponse JSON
L'histoire du port devenant inutilisable dans l'exemple de programme Spring Boot
Page d'erreur Spring Boot Whitelabel et réponse JSON
[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
Je veux contrôler le message d'erreur par défaut de Spring Boot
Erreur inconnue dans la ligne 1 de pom.xml lors de l'utilisation de Spring Boot dans Eclipse
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Méthode de résolution d'erreur Spring Boot + PostgreSQL
Sortie de message (Spring boot)
Erreur de mise en œuvre lors de la mise en œuvre de la validation Spring
Mémorandum WebMvcConfigurer de Spring Boot 2.0 (printemps 5)
Erreur Javaw.exe lors du démarrage de Spring Boot (STS)
À partir de Spring Boot 2.3, la page d'erreur par défaut ne contient plus d'informations détaillées sur l'erreur
[Java] [Spring Boot] Spécifier le profil d'exécution --Spring Boot à partir de NetBeans
Accédez au h2db intégré de Spring Boot avec jdbcTemplate
[Spring Boot] Obtenez des informations utilisateur avec l'API Rest (débutant)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Télécharger avec Spring Boot
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
Une histoire remplie des bases de Spring Boot (résolu)
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3