Je gère REST exceptions en utilisant @ControllerAdvice
Et ResponseEntityExceptionHandler
dans un webservice Spring Rest. Jusqu'à présent, tout fonctionnait bien jusqu'à ce que je décide d'ajouter le URI
chemin (pour lequel une exception s'est produite) dans la réponse BAD_REQUEST.
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
logger.info(request.toString());
return handleExceptionInternal(ex, errorMessage(HttpStatus.BAD_REQUEST, ex, request), headers, HttpStatus.BAD_REQUEST, request);
}
private ApiError errorMessage(HttpStatus httpStatus, Exception ex, WebRequest request) {
final String message = ex.getMessage() == null ? ex.getClass().getName() : ex.getMessage();
final String developerMessage = ex.getCause() == null ? ex.toString() : ex.getCause().getMessage();
return new ApiError(httpStatus.value(), message, developerMessage, System.currentTimeMillis(), request.getDescription(false));
}
ApiError est juste une classe Pojo:
public class ApiError {
private Long timeStamp;
private int status;
private String message;
private String developerMessage;
private String path;
}
Mais WebRequest n'a donné aucune API pour obtenir le chemin pour lequel la demande a échoué. J'ai essayé: request.toString()
renvoie -> ServletWebRequest: uri =/signup; client = 0: 0: 0: 0: 0: 0: 0: 1 request.getDescription(false)
renvoie -> uri =/signup getDescription
est assez proche de l'exigence, mais ne la satisfait pas. Existe-t-il un moyen d'obtenir uniquement la partie uri?
J'ai trouvé la solution. Casting WebRequest
vers ServletWebRequest
a résolu le problème.
((ServletWebRequest)request).getRequest().getRequestURI().toString()
renvoie le chemin complet - http://localhost:8080/signup
Il existe plusieurs solutions à ce problème.
1) On peut obtenir l'URI de demande et les informations client de WebRequest en utilisant webRequest.getDescription (true).
true affichera les informations de l'utilisateur telles que l'ID client et false affichera simplement l'URI.
2) Au lieu de WebRequest of Use, HttpServletRequest directement dans la définition de méthode comme
handle ResponseEntity protégéHttpMessageNotReadable (ex HttpMessageNotReadableException, en-têtes HttpHeaders, état HttpStatus, demande WebRequest, demande HttpServletRequest)