J'ai essayé de personnaliser la réponse au moment de l'erreur avec Spring Boot, je la décrirai donc ici comme un mémorandum. Dans l'article précédent (https://qiita.com/Keisuke1119/items/d13302582fbf933b5fa4), j'ai défini ma propre exception et essayé de gérer cette exception, mais cette fois j'ai essayé de gérer l'exception, mais cette fois c'est une exception définie par Spring. Je voudrais décrire la poignée de.
J'ai pu compléter l'exception d'origine définie dans l'article précédent, mais lorsque l'exception définie par Spring au début de l'exception MethodArgumentNotValidException
s'est produite, le contenu de l'erreur a été renvoyé avec une partie de corps nulle. Cette fois, je résumerai la cause et la politique de contre-mesure.
«Une introduction complète au développement d'applications Spring Java avec Spring Framework» déclare comme suit. Je vais citer ci-dessous.
ResponseEntityExceptionHandler implémente la méthode @ExceptionHandler qui gère les exceptions qui se produisent dans le processus de framework Spring MVC. En d'autres termes, vous pouvez gérer toutes les exceptions qui se produisent dans le traitement du framework simplement en créant une classe comme celle ci-dessus. Si vous créez simplement une classe qui hérite de la classe ResponseEntityExceptionHandler, le corps de la réponse répondra avec une erreur dans l'état de. Si vous créez simplement une classe qui hérite de ResponseEntityExceptionHandler, le corps de la réponse répondra vide. Remplacez la méthode handleExceptionInternal si vous souhaitez afficher des informations d'erreur dans le corps de la réponse.
Maintenant, nous connaissons la cause directe.
Dans Article précédent, le traitement des descripteurs pour les exceptions d'origine a été implémenté, mais le traitement des descripteurs est défini pour toutes les exceptions définies par Spring. Je pense que la partie du corps a été effacée même si une exception s'est produite parce qu'elle ne l'était pas.
(= Au stade de la définition de la classe de handle qui hérite de ResponseEntityExceptionHandler
, il semble que vous deviez définir non seulement l'exception d'origine mais aussi la méthode de handle lorsque d'autres exceptions se produisent. Je ne suis pas très familier avec ce domaine. Veuillez me dire les détails ...)
Cette fois, je l'ai vérifié dans la base de code.
Si vous cochez la méthode handleMethodArgumentNotValid
qui gère la MethodArgumentNotValidException
de la classe parente ResponseEntityExceptionHadler
, null
est explicitement passé à la partie du corps, et lorsque vous déboguez, ce processus est passé.
ResponseEntityExceptionHadler.java
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
return handleExceptionInternal(ex, null, headers, status, request);
}
Pour le contenu et l'ordre des arguments de handleExceptionInternal
, reportez-vous à Article précédent.
Comme vous pouvez le voir dans ce qui précède, null
est explicitement passé à la partie corps de l'argument de la méthode, donc si vous remplacez cette méthode et transmettez le contenu d'erreur que vous souhaitez réellement afficher à la partie corps, il doit être affiché. est.
Ensuite, j'aimerais vraiment le déplacer.
HelloSpringExceptionController.java
package com.example.demo.springExceptionErrorResponse;
import com.example.demo.errorResponse.ErrorDetail;
import com.example.demo.errorResponse.MyException;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/springexceptionhandle")
public class HelloSpringExceptionController {
@RequestMapping("/test")
public void get(@RequestBody @Validated Person person, Model model) {
}
}
Person.java
package com.example.demo.springExceptionErrorResponse;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class Person {
@NotNull
String firstName;
@NotNull
String lastName;
}
Cette fois, j'ai simplement passé la chaîne C'est une erreur. ''
.
Pour cela, essayez de le définir comme vous le souhaitez, par exemple en définissant une classe pour le corps au moment d'une erreur.
SpringExceptionHandler.java
package com.example.demo.springExceptionErrorResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@RestControllerAdvice
public class SpringExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleExceptionInternal(
Exception ex,
Object object,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
return super.handleExceptionInternal(ex, "C'est une erreur.", headers, status, request);
}
}
Ci-dessous, essayez de demander JSON à partir de http: // localhost: 8080 / springexceptionhandle / test
avec POST
.
Cette demande doit entraîner une erreur car la contrainte @ NotNull
a été appliquée à firstName
pour Person.java
.
input.json
{
"firstName": null,
"lastName": "Nom"
}
C'est une erreur.
Ce qui précède est solitaire en tant que corps de réponse, mais si vous souhaitez afficher l'heure à laquelle une erreur s'est produite, le code d'état, etc., répondez comme Article précédent Vous devriez pouvoir le voir en définissant une classe spécifique au corps et en passant une instance de cette classe comme deuxième argument à la méthode super.handleExceptionInternal
.
Personnaliser la réponse d'erreur de l'API REST avec Spring Boot (Partie 1)
Cette fois, j'ai fait référence à l'article suivant lors de la rédaction de l'article.
[Présentation approfondie du développement d'applications Spring Java avec Spring Framework](https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80- Spring-Framework% E3% 81% AB% E3% 82% 88% E3% 82% 8BJava% E3% 82% A2% E3% 83% 97% E3% 83% AA% E3% 82% B1% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E9% 96% 8B% E7% 99% BA-% E6% A0% AA% E5% BC% 8F% E4% BC% 9A % E7% A4% BENTT% E3% 83% 87% E3% 83% BC% E3% 82% BF / dp / 4798142476) Personnalisez la réponse d'erreur de l'API REST créée par Spring Boot Gestion des erreurs avec Spring Boot Gestion des exceptions avec @ RestController de Spring Boot
Recommended Posts