35

我真的不确定使用 Spring 3.2 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. 如何在同一方法中根据条件处理多个响应状态?
4

3 回答 3

29

@ResponseStatus(HttpStatus.OK)表示如果处理方法正常返回,请求将返回 OK(此注解对于这种情况是多余的,因为默认响应状态为HttpStatus.OK)。如果方法抛出异常,则注解不适用;相反,状态将由 Spring 使用异常处理程序确定。

如何在同一方法中根据条件处理多个响应状态?

这个问题已经被问过了

我可以在发生任何异常时更改响应状态吗

你有两个选择。如果异常类是你自己的,你可以用@ResponseStatus. 另一种选择是为控制器类提供一个异常处理程序,用 注释@ExceptionHandler,并让异常处理程序设置响应状态。

于 2013-07-08T12:40:53.717 回答
13

如果您直接返回一个 ResponseEntity,您可以在其中设置 HttpStatus:

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

如果要返回 404 以外的错误,HttpStatus 有很多其他值可供选择。

于 2013-09-24T16:37:18.847 回答
10

您不能为 设置多个状态值@ResponseStatus。我能想到的一种方法是@ExceptionHandler用于响应状态,这不是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(...);
}
于 2013-07-09T03:33:17.403 回答