【问题标题】:Multiple response http status in Spring MVCSpring MVC中的多响应http状态
【发布时间】:2011-11-20 10:58:09
【问题描述】:

有以下代码:

@RequestMapping(value =  "/system/login", method = RequestMethod.GET)
public void login(@RequestBody Login login) {
    if(login.username == "test" && login.password == "test") {
         //return HTTP 200
    }
    else {
         //return HTTP 400
    }
}

我想根据我的逻辑返回两种不同的 HTTP 状态。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 我想我已经找到了一种可行的方法,您要做的就是在方法中添加 HttpServletResponse 响应,最后一个参数,然后简单地设置 setStatus。

标签: jakarta-ee spring-mvc


【解决方案1】:

有人在 SO 建议的一种方法是抛出不同的异常,这些异常将被不同的异常处理程序捕获:

@RequestMapping(value =  "/system/login", method = RequestMethod.GET)
public void login(@RequestBody Login login) {
    if(login.username == "test" && login.password == "test") {
         throw new AllRightException();
    }
    else {
         throw new AccessDeniedException();
    }
}

@ExceptionHandler(AllRightException.class)
@ResponseStatus(HttpStatus.OK)
public void whenAllRight() {

}

@ExceptionHandler(AccessDeniedException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void whenAccessDenied() {

}

另见:

顺便说一句,您的示例代码包含错误:login.password == "test" 您应该在那里使用equals() :)


更新:我发现了另一种更好的方法,因为它不使用异常:

@RequestMapping(value =  "/system/login", method = RequestMethod.GET)
public ResponseEntity<String> login(@RequestBody Login login) {
    if(login.username == "test" && login.password == "test") {
         return new ResponseEntity<String>("OK" HttpStatus.OK);
    }

    return new ResponseEntity<String>("ERROR", HttpStatus.BAD_REQUEST);
}

另见ResponseEntity API

【讨论】:

  • 感谢这个错误,但这只是一个类似 java 的伪代码。
  • 您甚至可以使用 ResponseEntity 返回带有 @ResponseBody 的 JSON。
  • 虽然这是一个老问题,但我想我应该指出,使用 Exceptions for 200 并不是一个好主意……每次你想到 AlrightException 时,你可能应该想到一个替代方案。在这种特殊情况下,最常见的方法是在主流程中处理成功流程,如果凭据无效则抛出 AccessDeniedException。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
相关资源
最近更新 更多