J'ai un contrôleur Spring Boot avec le paramètre @PathVariable long stopPointId, lorsque l'utilisateur enverra une demande du type "url/StopPoints/1", tout fonctionne parfaitement, mais lorsque la demande ressemblera à "url/StopPoints/StopPointNumber", rien ne se passera . Je veux attraper cette situation et lancer mon erreur personnalisée parce que l'utilisateur doit savoir que ce paramètre ne prend qu'une valeur longue. Par exemple : vous ne pouvez pas passer String en paramètre. Vous devez utiliser une valeur numérique, par exemple 123."

0
mflorczak 9 nov. 2020 à 19:13

1 réponse

Meilleure réponse

Une façon serait de gérer le NumberFormatException qui serait lancé par Spring Boot tout en essayant de transtyper une chaîne dans un Long.

Ceci est ma classe de réponse HTTP personnalisée, mais j'espère que vous avez la vôtre...

package com.stackoverflow.rav.StackOverflowExamples.api;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.http.HttpStatus;

import java.util.Date;

public class HttpResponse {

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM-dd-yyyy hh:mm:ss", timezone = "UTC")
    private Date timeStampUTC;
    private int httpStatusCode;
    private HttpStatus httpStatus;
    private String reason;
    private String message;
    
    /* Include setters, getters, constructors, or use Lombok */

}

Ensuite, le gestionnaire d'exceptions... (le message d'exception doit être générique afin d'augmenter la réutilisabilité)

package com.stackoverflow.rav.StackOverflowExamples.api;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ExampleExceptionHandler {

    @ExceptionHandler(NumberFormatException.class)
    public ResponseEntity<HttpResponse> accountDisabledException() {
        return createHttpResponse(HttpStatus.BAD_REQUEST, "Should pass long not string!");
    }

    private ResponseEntity<HttpResponse> createHttpResponse(HttpStatus httpStatus, String message) {
        return new ResponseEntity<>(new HttpResponse(
                httpStatus.value(),
                httpStatus,
                httpStatus.getReasonPhrase().toUpperCase(),
                message.toUpperCase()),
                httpStatus);
    }
}

Enfin le contrôleur...

package com.stackoverflow.rav.StackOverflowExamples.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExampleController extends ExampleExceptionHandler {

    @GetMapping("/url/{someValue}")
    public String hello(@PathVariable("someValue") long someValue) {

        return "You entered: " +someValue;
    }
}

Si tout se passe bien, vous devriez obtenir une réponse comme l'extrait d'écran ci-dessous lorsque vous faites http://localhost:8080/url/abcd entrez la description de l'image ici

Cette réponse peut sembler longue, mais nous sommes des développeurs Java :D

3
Dharman 9 nov. 2020 à 17:29