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. Cette fois, j'aimerais personnaliser la partie du corps de la réponse comme suit.
Changer avant
{
"timestamp": "2019-03-14T15:07:50.631+0000",
"status": 500,
"error": "Internal Server Error",
"message": "MyException s'est produite",
"path": "/××××/××××"
}
Après le changement
{
"timestamp": "2019-03-14T15:07:50.631+0000",
"status": 500,
"error": "Internal Server Error",
"message": "MyException s'est produite",
"path": "/××××/××××",
"errorDetail": {
"detailMessage": "××××××××××××"
}
}
Les quatre personnages suivants sont à peu près les personnages cette fois.
--Classe de contrôleur qui accepte les demandes
De plus, le déroulement général du processus à mettre en œuvre désormais est le suivant.
Après cela, nous mettrons en œuvre le traitement ci-dessus. (Bien que la commande ne soit pas en ordre ...)
Ici, nous définissons la classe de mappage pour le corps de la réponse.
ErrorResponseBody.java
package com.example.demo.errorResponse;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Setter;
import java.time.ZonedDateTime;
@Setter
public class ErrorResponseBody {
@JsonProperty("timestamp")
private ZonedDateTime exceptionOccurrenceTime;
@JsonProperty("status")
private int status;
@JsonProperty("error")
private String error;
@JsonProperty("message")
private String message;
@JsonProperty("path")
private String path;
@JsonProperty("errorDetail")
private ErrorDetail errorDetail;
}
ErrorDetail.java
package com.example.demo.errorResponse;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Setter;
@Setter
public class ErrorDetail {
@JsonProperty("detailMessage")
String detailMessage;
}
MyException.java
package com.example.demo.errorResponse;
import lombok.Getter;
@Getter
public class MyException extends RuntimeException {
private ErrorDetail errorDetails;
public MyException(String message, ErrorDetail errorDetails) {
super(message);
this.errorDetails = errorDetails;
}
}
HelloController.java
package com.example.demo.errorResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/exceptionhandle")
public class HelloController {
@RequestMapping("/test")
public String get() {
ErrorDetail errorDetail = new ErrorDetail();
errorDetail.setDetailMessage("Message détaillé");
throw new MyException("MyException s'est produite", errorDetail);
}
}
C'est la partie la plus importante. Il y a quatre points.
@ RestControllerAdvice
à la classe de descripteursResponseEntityExceptionHandler
@ ExceptionHandler
et spécifiez la classe d'exception définie de manière unique à compléter.super.handleExceptionInternal
(à part, les arguments de cette méthode sont dans l'ordre suivant).Et enfin, il renvoie ResponseEntity
.
HelloExceptionHandler.java
package com.example.demo.errorResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.time.ZonedDateTime;
@RestControllerAdvice
public class HelloExceptionHandler extends ResponseEntityExceptionHandler {
//Attraper MyException lancée par le contrôleur
@ExceptionHandler(MyException.class)
public ResponseEntity<Object> handleMyException(MyException exception, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
return super.handleExceptionInternal(exception,
createErrorResponseBody(exception, request),
headers,
HttpStatus.BAD_REQUEST,
request);
}
//Créer la partie du corps de la réponse
private ErrorResponseBody createErrorResponseBody(MyException exception, WebRequest request) {
ErrorResponseBody errorResponseBody = new ErrorResponseBody();
int responseCode = HttpStatus.BAD_REQUEST.value();
String responseErrorMessage = HttpStatus.BAD_REQUEST.getReasonPhrase();
String uri = ((ServletWebRequest) request).getRequest().getRequestURI();
errorResponseBody.setExceptionOccurrenceTime(ZonedDateTime.now());
errorResponseBody.setStatus(responseCode);
errorResponseBody.setError(responseErrorMessage);
errorResponseBody.setMessage(exception.getMessage());
errorResponseBody.setPath(uri);
errorResponseBody.setErrorDetail(exception.getErrorDetails());
return errorResponseBody;
}
}
En passant, la méthode handleExceptionInternal
de la classe parent ResponseEntityExceptionHandler
ressemble à ceci: La partie qui passe l'instance pour la réponse d'erreur est @Nullable Object body
, donc si vous ne la passez pas correctement, la partie du corps ne sera pas affichée.
ResponseEntityExceptionHandler.java
/**
* A single place to customize the response body of all Exception types.
* <p>The default implementation sets the {@link WebUtils#ERROR_EXCEPTION_ATTRIBUTE}
* request attribute and creates a {@link ResponseEntity} from the given
* body, headers, and status.
* @param ex the exception
* @param body the body for the response
* @param headers the headers for the response
* @param status the response status
* @param request the current request
*/
protected ResponseEntity<Object> handleExceptionInternal(
Exception ex, @Nullable Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
}
return new ResponseEntity<>(body, headers, status);
}
{
"timestamp": "2019-03-18T10:11:13.795+09:00",
"status": 400,
"error": "Bad Request",
"message": "MyException s'est produite",
"path": "/exceptionhandle/test",
"errorDetail": {
"detailMessage": "Message détaillé"
}
}
Personnaliser la réponse d'erreur de l'API REST avec Spring Boot (Partie 2)
Cette fois, j'ai fait référence à l'article suivant lors de la rédaction de l'article.
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