2013-07-08 18 views
23

Non sono sicuro se questo sia possibile utilizzando Spring 3.2 MVC.Modifica dinamica di @ResponseStatus in MVC Spring con annotazioni

mio controller ha un metodo dichiarato come di seguito:

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

Domande:

  1. Qual è il significato di @ResponseStatus(HttpStatus.OK)?
  2. Significa che il metodo restituirà sempre un codice di stato HttpStatus.OK.
  3. Cosa succede se viene generata un'eccezione dal livello di servizio?
  4. Posso modificare lo stato di risposta al verificarsi di un'eventuale eccezione?
  5. Come posso gestire più stati di risposta a seconda delle condizioni nello stesso metodo?
+0

http://www.captaindebug.com/2012/02/spring-3-mvc-exception-handlers-and_14.html#.Vapp2JSgPqR –

+0

** 1. ** Leggere [Stato] (http: // www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) Probabilmente dovresti usare 'ResponseEntity'. – user902691

risposta

22

@ResponseStatus(HttpStatus.OK) significa che la richiesta tornerà OK se il metodo di movimentazione restituisce normalmente (questa annotazione è ridondante per questo caso, come lo stato di risposta predefinito è HttpStatus.OK). Se il gestore genera un'eccezione, l'annotazione non viene applicata.

Come posso gestire più stati di risposta a seconda delle condizioni nello stesso metodo?

Tale domanda has already been asked.

Posso cambiare lo stato di risposta al verificarsi delle eccezioni

Hai due scelte. Se la classe di eccezione è una delle tue, puoi annotare la classe di eccezione con @ResponseStatus. L'altra scelta è quella di fornire alla classe controller un gestore di eccezioni, annotato con @ExceptionHandler, e fare in modo che il gestore di eccezioni imposti lo stato della risposta.

+0

Sì, la domanda è già stata fatta ma hai ricevuto una risposta ?? – dharam

+0

Non importa se ho una risposta; la seconda parte della tua domanda è un duplicato di una domanda precedente. Le domande duplicate vengono chiuse, quindi la parte importante della tua domanda dovrebbe essere la prima parte. – Raedwald

+6

È stato chiesto ma l'unica risposta è stata votata per difetto.Dovresti fornire una risposta concreta alla seconda domanda invece di puntare a quella discussione dubbiosa. – Bnrdo

9

Non è possibile impostare più valori di stato per @ResponseStatus. Un approccio mi viene in mente è quello di utilizzare @ExceptionHandler per lo stato di risposta che non è 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(...); 
} 
12

Se si torna direttamente un ResponseEntity, è possibile impostare il HttpStatus in quanto:

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

Se si desidera restituire un errore diverso da 404, HttpStatus has lots of other values tra cui scegliere.

Problemi correlati