为了账号安全,请及时绑定邮箱和手机立即绑定

如何为@ResponseStatus 创建分支结果

如何为@ResponseStatus 创建分支结果

翻过高山走不出你 2023-02-23 17:41:53
使用@ResponseStatus 允许在 Spring 中设置 Rest 响应的状态。但是,如何将其用于可能来自同一请求的不同类型的状态呢?例如,控制器中有一个方法可能会返回 200 或 404。我如何仅在一个方法中使用 @ResponseStatus 来定义这些状态?
查看完整描述

4 回答

?
慕村225694

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;

}


查看完整回答
反对 回复 2023-02-23
?
守着星空守着你

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);

    }


查看完整回答
反对 回复 2023-02-23
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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



查看完整回答
反对 回复 2023-02-23
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您不能使用 @ResponseStatus 根据分支结果从一种方法设置不同的状态代码。

您将不得不返回一个 ResponseEntity 或直接在您的方法中操作 HttpServletResponse(或者最终在异常处理程序返回状态的错误情况下抛出异常)


查看完整回答
反对 回复 2023-02-23
  • 4 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号