2013-07-08 31 views
23

我真的不確定使用Spring 3.2 MVC這是否可行。動態更改註解驅動中的@ResponseStatus Spring MVC

我的控制器已宣佈的方法如下:

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

問題:

  1. 什麼是@ResponseStatus(HttpStatus.OK)意思?
  2. 它表示該方法將始終返回HttpStatus.OK狀態碼。
  3. 如果從服務層拋出異常會怎麼樣?
  4. 發生任何異常時可以更改響應狀態嗎?
  5. 如何根據同一方法中的條件處理多個響應狀態?
+0

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

+0

** 1。**請閱讀[狀態](http:// www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)可能你應該使用'ResponseEntity'。 – user902691

回答

22

@ResponseStatus(HttpStatus.OK)意味着請求將返回OK,如果處理方法通常返回(這注釋是多餘的用於這種情況下,作爲默認響應狀態爲HttpStatus.OK)。如果處理程序引發異常,則註釋不適用。

如何根據同一方法中的條件處理多個響應狀態?

那個問題has already been asked

我可以改變任何異常

發生響應狀態你有兩個選擇。如果異常類是您自己的異常類,則可以使用@ResponseStatus註釋異常類。另一種選擇是爲控制器類提供異常處理程序,並使用@ExceptionHandler進行註釋,並讓異常處理程序設置響應狀態。

+0

是的問題已經被問到,但你有答案? – dharam

+0

如果我有答案,這並不重要;問題的第二部分是上一個問題的重複。重複的問題得到了解決,所以你的問題的重要部分應該是第一部分。 – Raedwald

+6

已經有人問,但唯一的答案是收到了投票。你應該爲第二個問題提供一個具體的答案,而不是指向那個可疑的線程。 – Bnrdo

9

您不能爲@ResponseStatus設置多個狀態值。一種方法我能想到的是使用@ExceptionHandler。如果你直接返回ResponseEntity這是不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

響應狀態,您可以設置的HTTPStatus在於:

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

如果你想返回404,HttpStatus has lots of other values以外的錯誤可供選擇。

相關問題