Jakarta ee SpringMVC中的多响应http状态

Jakarta ee SpringMVC中的多响应http状态,jakarta-ee,spring-mvc,Jakarta Ee,Spring Mvc,具有以下代码: @RequestMapping(value = "/system/login", method = RequestMethod.GET) public void login(@RequestBody Login login) { if(login.username == "test" && login.password == "test") { //return HTTP 200 } else { //

具有以下代码:

@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状态。实现这一点的最佳方法是什么?

有人在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);
}
@RequestMapping(value=“/system/login”,method=RequestMethod.GET)
公共响应登录(@RequestBody登录){
if(login.username==“test”&&login.password==“test”){
返回新的响应状态(“OK”HttpStatus.OK);
}
返回新的响应属性(“错误”,HttpStatus.BAD_请求);
}

另请参见

我想我已经找到了一种工作方式,您需要做的是在方法中添加HttpServletResponse,最后一个参数,然后简单地设置setStatus。感谢这个错误,但这只是一个java伪代码。您甚至可以使用ResponseEntity返回带有@ResponseBody的JSon。尽管这是一个老问题,我想我应该指出,对200使用异常不是一个好主意。。。每次你想到一个完全例外的情况,你都应该想到另一个选择。在这种特殊情况下,最常见的方法是在主流中处理成功流,如果它是无效凭证,则抛出AccessDeniedException。