2013-07-08 4 views
23

Naprawdę nie jestem pewien, czy jest to wykonalne przy użyciu Spring 3.2 MVC.Dynamiczna zmiana parametru @ResponseStatus w skrypcie Spring MVC z dodaną adnotacją

moim kontroler ma metodę zadeklarowane jako poniżej:

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

pytania:

  1. Jaki jest sens @ResponseStatus(HttpStatus.OK)?
  2. Czy oznacza to, że metoda zawsze zwróci kod statusu HttpStatus.OK.
  3. Co się stanie, jeśli wyjątek zostanie zgłoszony z warstwy usługi?
  4. Czy mogę zmienić status odpowiedzi na wystąpienie jakiegokolwiek wyjątku?
  5. Jak mogę obsłużyć wiele stanów odpowiedzi w zależności od warunków w tej samej metodzie?
+0

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

+0

** 1. ** Przeczytaj [Status] (http: // www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) Prawdopodobnie powinieneś użyć 'ResponseEntity'. – user902691

Odpowiedz

22

@ResponseStatus(HttpStatus.OK) oznacza, że ​​zapytanie zwróci OK jeśli metoda obsługa zwraca się normalnie (to adnotacja jest zbędne w tym przypadku, jako domyślny stan odpowiedź jest HttpStatus.OK). Jeśli program obsługi zgłasza wyjątek, adnotacja nie ma zastosowania.

Jak mogę obsłużyć wiele stanów odpowiedzi w zależności od warunków w tej samej metodzie?

To pytanie has already been asked.

mogę zmienić status reagowania na wystąpienie wyjątku

Masz dwie możliwości. Jeśli klasa wyjątku jest jedną z twoich, możesz dodać adnotację do klasy wyjątków z @ResponseStatus. Innym rozwiązaniem jest dostarczenie klasie kontrolera obsługi wyjątków opatrzonej komentarzem @ExceptionHandler i ustawienie obsługi odpowiedzi przez procedurę obsługi wyjątku.

+0

Tak, pytanie jest już zadane, ale czy otrzymałeś odpowiedź? – dharam

+0

Nie ma znaczenia, czy mam odpowiedź; druga część twojego pytania jest duplikatem poprzedniego pytania. Duplikaty pytań są zamknięte, więc ważną częścią twojego pytania powinna być pierwsza część. – Raedwald

+6

Zostało to zadane, ale jedyna odpowiedź otrzymała głos w dół.Powinieneś podać konkretną odpowiedź na drugie pytanie zamiast wskazywać na tę wątpliwą nitkę. – Bnrdo

9

Nie można ustawić wartości wielu stanów dla @ResponseStatus. Jedno podejście mogę myśleć jest użycie @ExceptionHandler statusu odpowiedzi, która nie jest 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

Jeśli zwróci ResponseEntity bezpośrednio, można ustawić httpStatus że:

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

Jeśli chcesz zwróć błąd inny niż 404, HttpStatus has lots of other values do wyboru.

Powiązane problemy