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:
@ResponseStatus(HttpStatus.OK)
?HttpStatus.OK
.@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.
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.
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(...);
}