4 回答
TA贡献1880条经验 获得超4个赞
通常你不会用@ResponseStatus. 相反,您可以用作ResponseEntity<...>方法的返回类型。如果退货的“类型”可以改变,ResponseEntity<?>或者ResponseEntity<Object>也可以工作。
例如:
@GetMapping("/{key}")
public ResponseEntity<Thing> getThing(final @PathVariable String key) {
final Thing theThing = this.thingService.get(key);
final ResponseEntity<?> response;
if (theThing.someProperty()) {
response = ResponseEntity.ok(theThing);
} else {
response = ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);
}
return response;
}
TA贡献1799条经验 获得超8个赞
要直接回答你的问题,@ResponseStatus 不能用于通过单一方法发送不同的状态。
如果你想使用@ResponseStatus,你如何处理多个状态是:
@ResponseStatus用所需的2xx 注释控制器方法HttpStatus。在成功场景中,此状态将由控制器方法发送。通常它用于设置200HttpStatus以外的值(如201),因为即使不使用200也是默认发送的状态。@ResponseStatus有带有注释的异常处理程序方法
@ExceptionHandler,以处理不同的异常场景,也带有@ResponseStatus相应的注释HttpStatus。例如,如果您想处理资源未找到的情况,则可以对异常处理程序方法进行注释@ResponseStatus(HttpStatus.NOT_FOUND)以发回404。如果您不需要发送动态错误响应,您甚至可以将自定义异常类与
@ResponseStatusrequired 一起标记HttpStatus,当异常被抛出(而不是明确地捕获和吞噬)时,HttpStatus将返回相应的异常。
您甚至可以利用ResponseEntitywhich 有一个方法,您可以在控制器方法或异常处理程序方法中status传递所需的并返回,如下所示:HttpStatus
控制器方法:
@GetMapping("/resource")
public ResponseEntity<Object> getResource(){
if(resourcePresent){
return new ResponseEntity(resource, HttpStatus.OK);
} else {
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
}
}
异常处理方法:
@ExceptionHandler(BadRequestException.class)
public ResponseEntity<Object> handleBadRequestException(BadRequestException exception){
return new ResponseEntity<>(customResponse, HttpStatus.BAD_REQUEST);
}
TA贡献1796条经验 获得超4个赞
我不确定这是否会回答你的问题,但你可以抛出一个ResponseStatusException你需要的状态代码。但是将它用于 200 会很奇怪。
TA贡献1895条经验 获得超7个赞
您不能使用 @ResponseStatus 根据分支结果从一种方法设置不同的状态代码。
您将不得不返回一个 ResponseEntity 或直接在您的方法中操作 HttpServletResponse(或者最终在异常处理程序返回状态的错误情况下抛出异常)
添加回答
举报
