web-dev-qa-db-fra.com

Comment obtenir l'URI de la demande de WebRequest au printemps?

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?

8
TheCoder

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

24
TheCoder

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)

1
Vishal Pawar