2 votes

Comment créer des résultats de branchement pour @ResponseStatus

L'utilisation de @ResponseStatus permet de définir le statut d'une réponse Rest dans Spring. Mais comment l'utiliser pour différents types de statuts pouvant provenir d'une même requête ?

Par exemple, il existe une méthode dans le contrôleur qui peut renvoyer un 200 ou un 404. Comment pourrais-je définir ces statuts en utilisant simplement @ResponseStatus dans une méthode ?

2voto

user2478398 Points 11

Typiquement, vous ne feriez pas cela avec @ResponseStatus . Au lieu de cela, vous pouvez utiliser ResponseEntity<...> comme type de retour de votre méthode. Si le "type" de l'élément retourné peut changer, ResponseEntity<?> o ResponseEntity<Object> fonctionne également.

Par exemple :

@GetMapping("/{key}")
public ResponseEntity<Thing> getThing(final @PathVariable String key) {
    final Thing theThing = this.thingService.get(key);

    final ResponseEntity<?> response;
    if (theThing.someProperty()) {
         response = ResponseEntity.ok(theThing);
    } else {
         response = ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);
    }

    return response;
}

2voto

Madhu Bhat Points 3694

Pour répondre directement à votre question, @ResponseStatus ne peut pas être utilisé pour envoyer différents statuts par une seule méthode.

Si vous veulent à utiliser @ResponseStatus la façon dont vous pouvez gérer les statuts multiples :

  • La méthode du contrôleur doit être annotée avec @ResponseStatus avec les 2xx HttpStatus . Ce statut sera envoyé par la méthode du contrôleur dans le scénario de réussite. Habituellement, il est utilisé pour définir HttpStatus autre que 200 (comme 201 ), comme 200 est le statut par défaut envoyé même sans utiliser @ResponseStatus .
  • Les méthodes de traitement des exceptions sont annotées avec @ExceptionHandler pour gérer les différents scénarios d'exception, également annotés avec l'option @ResponseStatus avec les HttpStatus . Par exemple, si vous voulez gérer un Ressource non trouvée la méthode du gestionnaire d'exception peut être annotée avec l'attribut @ResponseStatus(HttpStatus.NOT_FOUND) pour renvoyer un 404 .
  • Dans le cas où vous n'avez pas besoin d'envoyer une réponse d'erreur dynamique, vous pouvez même marquer la classe d'exception personnalisée avec l'option @ResponseStatus ainsi que les HttpStatus et lorsque l'exception est levée (et non pas attrapée et avalée explicitement), la fonction correspondante HttpStatus serait renvoyé.

Vous pouvez même tirer parti ResponseEntity qui a un status où vous pouvez passer la méthode HttpStatus et de retour, soit dans la méthode du contrôleur, soit dans la méthode du gestionnaire d'exception, comme ci-dessous :

Méthode de contrôle :

@GetMapping("/resource")
    public ResponseEntity<Object> getResource(){
        if(resourcePresent){
            return new ResponseEntity(resource, HttpStatus.OK);
        } else {
            return new ResponseEntity(HttpStatus.NOT_FOUND);
        }
    }
}

Méthode de traitement des exceptions :

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<Object> handleBadRequestException(BadRequestException exception){
        return new ResponseEntity<>(customResponse, HttpStatus.BAD_REQUEST);
    }

0voto

Fouad HAMDI Points 456

Vous ne pouvez pas utiliser @ResponseStatus pour définir un code d'état différent à partir d'une méthode en fonction des résultats du branchement.

Vous devrez renvoyer une ResponseEntity ou manipuler la HttpServletResponse directement dans votre méthode (ou éventuellement lancer des exceptions en cas d'erreur avec des gestionnaires d'exception renvoyant le statut).

0voto

burm87 Points 643

Je ne suis pas sûr que ça va répondre à votre question mais vous pourriez lancer un ResponseStatusException avec le code d'état dont vous avez besoin. L'utiliser pour le 200 serait cependant étrange.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X