web-dev-qa-db-fra.com

Modification dynamique de @ResponseStatus dans Spring MVC piloté par des annotations

Je ne suis vraiment pas sûr que cela soit possible en utilisant Spring 3.2 MVC.

Mon contrôleur a une méthode déclarée comme suit:

@RequestMapping(method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<Foo> getAll(){
    return service.getAll();
}

Questions:

  1. Quelle est la signification de @ResponseStatus(HttpStatus.OK)?
  2. Cela signifie-t-il que la méthode retournera toujours un code d'état HttpStatus.OK.
  3. Que faire si une exception est levée de la couche de service?
  4. Puis-je changer le statut de réponse en cas d'exception?
  5. Comment gérer plusieurs états de réponse en fonction des conditions de la même méthode?
31
dharam

@ResponseStatus(HttpStatus.OK) signifie que la requête retournera OK si la méthode de traitement revient normalement (cette annotation est redondante dans ce cas, car le statut de réponse par défaut est HttpStatus.OK). Si le gestionnaire lève une exception, l'annotation ne s'applique pas.

Comment gérer plusieurs états de réponse en fonction des conditions de la même méthode?

Cette question a déjà été posée .

Puis-je changer l'état de réponse en cas d'occurrence d'une exception

Vous avez deux choix. Si la classe d'exception est l'une des vôtres, vous pouvez annoter la classe d'exception avec @ResponseStatus. L'autre choix consiste à fournir à la classe de contrôleur un gestionnaire d'exceptions, annoté avec @ExceptionHandler et demandez au gestionnaire d'exceptions de définir l'état de la réponse.

27
Raedwald

Si vous renvoyez une ResponseEntity directement, vous pouvez définir le HttpStatus en cela:

// return with no body or headers    
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);

Si vous souhaitez renvoyer une erreur autre que 404, HttpStatus a beaucoup d'autres valeurs à choisir.

12
Ron Lunde

Vous ne pouvez pas définir plusieurs valeurs d'état pour @ResponseStatus. Une approche à laquelle je peux penser est d'utiliser @ExceptionHandler pour un état de réponse qui n'est pas HttpStatus.OK

@RequestMapping(value =  "login.htm", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public ModelAndView login(@ModelAttribute Login login) {
    if(loginIsValidCondition) {
        //process login
        //.....
        return new ModelAndView(...);
    }
    else{
        throw new InvalidLoginException();
    }
}

@ExceptionHandler(InvalidLoginException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ModelAndView invalidLogin() {
    //handle invalid login  
    //.....
    return new ModelAndView(...);
}
9
Bnrdo