使用@ResponseStatus可以在Spring中设置Rest响应的状态。但是,如何将其用于可能来自同一请求的不同状态?
例如,控制器中有一个方法可能返回200或404。我如何仅在一种方法中使用@ResponseStatus来定义这些状态?
答案 0 :(得分:2)
通常,您不会使用@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;
}
答案 1 :(得分:2)
要直接回答您的问题,@ResponseStatus
不能用于通过一种方法发送不同的状态。
如果您想要使用@ResponseStatus
,则如何处理多种状态为:
@ResponseStatus
,并带有必需的 2xx HttpStatus
。在成功方案中,此状态将由控制器方法发送。通常,它用于设置{strong> 200 以外的HttpStatus
(例如 201 ),因为即使不使用 200 ,它也是默认状态@ResponseStatus
。@ExceptionHandler
注释的异常处理程序方法,以处理不同的异常情况,也用@ResponseStatus
注释并带有相应的HttpStatus
。例如,如果您要处理找不到资源方案,则可以使用@ResponseStatus(HttpStatus.NOT_FOUND)
注释异常处理程序方法以发送回 404 。@ResponseStatus
与所需的HttpStatus
一起标记为自定义异常类捕获并吞下),将返回相应的HttpStatus
。您甚至可以利用具有ResponseEntity
方法的status
,在其中可以通过控制器方法或异常处理程序方法传递所需的HttpStatus
并返回,如下所示:< / p>
控制器方法:
@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);
}
答案 2 :(得分:0)
根据分支结果,不能使用@ResponseStatus设置与一种方法不同的状态代码。
您将必须在您的方法中直接返回ResponseEntity或操作HttpServletResponse(或最终在错误情况下引发异常,并且异常处理程序返回状态)
答案 3 :(得分:0)
我不确定这是否会回答您的问题,但是您可以使用所需的状态代码抛出ResponseStatusException
。但是,将它用于200会很奇怪。