如何为@ResponseStatus创建分支结果

时间:2019-06-28 13:39:06

标签: java spring

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

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

4 个答案:

答案 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会很奇怪。