如何为@ResponseStatus 创建分支结果

使用@ResponseStatus 允许在 Spring 中设置 Rest 响应的状态。但是,如何将其用于可能来自同一请求的不同类型的状态呢?

例如,控制器中有一个方法可能会返回 200 或 404。我如何仅在一个方法中使用 @ResponseStatus 来定义这些状态?


翻过高山走不出你
浏览 185回答 4
4回答

慕村225694

通常你不会用@ResponseStatus. 相反,您可以用作ResponseEntity<...>方法的返回类型。如果退货的“类型”可以改变,ResponseEntity<?>或者ResponseEntity<Object>也可以工作。例如:@GetMapping("/{key}")public ResponseEntity<Thing> getThing(final @PathVariable String key) {&nbsp; &nbsp; final Thing theThing = this.thingService.get(key);&nbsp; &nbsp; final ResponseEntity<?> response;&nbsp; &nbsp; if (theThing.someProperty()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;response = ResponseEntity.ok(theThing);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;response = ResponseEntity.status(HttpStatus.NOT_MODIFIED).body(null);&nbsp; &nbsp; }&nbsp; &nbsp; return response;}

守着星空守着你

要直接回答你的问题,@ResponseStatus&nbsp;不能用于通过单一方法发送不同的状态。如果你想使用@ResponseStatus,你如何处理多个状态是:@ResponseStatus用所需的2xx&nbsp;注释控制器方法HttpStatus。在成功场景中,此状态将由控制器方法发送。通常它用于设置200HttpStatus以外的值(如201),因为即使不使用200也是默认发送的状态。@ResponseStatus有带有注释的异常处理程序方法@ExceptionHandler,以处理不同的异常场景,也带有@ResponseStatus相应的注释HttpStatus。例如,如果您想处理资源未找到的情况,则可以对异常处理程序方法进行注释@ResponseStatus(HttpStatus.NOT_FOUND)以发回404。如果您不需要发送动态错误响应,您甚至可以将自定义异常类与@ResponseStatusrequired 一起标记HttpStatus,当异常被抛出(而不是明确地捕获和吞噬)时,HttpStatus将返回相应的异常。您甚至可以利用ResponseEntitywhich 有一个方法,您可以在控制器方法或异常处理程序方法中status传递所需的并返回,如下所示:HttpStatus控制器方法:@GetMapping("/resource")&nbsp; &nbsp; public ResponseEntity<Object> getResource(){&nbsp; &nbsp; &nbsp; &nbsp; if(resourcePresent){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new ResponseEntity(resource, HttpStatus.OK);&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new ResponseEntity(HttpStatus.NOT_FOUND);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}异常处理方法:&nbsp; &nbsp; @ExceptionHandler(BadRequestException.class)&nbsp; &nbsp; public ResponseEntity<Object> handleBadRequestException(BadRequestException exception){&nbsp; &nbsp; &nbsp; &nbsp; return new ResponseEntity<>(customResponse, HttpStatus.BAD_REQUEST);&nbsp; &nbsp; }

慕的地8271018

我不确定这是否会回答你的问题,但你可以抛出一个ResponseStatusException你需要的状态代码。但是将它用于 200 会很奇怪。

人到中年有点甜

您不能使用 @ResponseStatus 根据分支结果从一种方法设置不同的状态代码。您将不得不返回一个 ResponseEntity 或直接在您的方法中操作 HttpServletResponse(或者最终在异常处理程序返回状态的错误情况下抛出异常)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java