CompletableFuture<ResponseEntity> 状态码预期

CompletableFuture<ResponseEntity> Status Code Expectations

所以,我创建了一个控制器,其中有一个 POST 端点,如下所示:

@PostMapping("/foo/{some-field}")
public CompletableFuture<ResponseEntity> foo() {
    //Do some operations...
    ...
    if(doesNotExist({some-field})) {
        return CompletableFuture.completedFuture(ResponseEntity.notFound().build());
    }
    return CompletableFuture.completedFuture(ResponseEntity.ok().build());
}

现在我希望如果 doesNotExist({some-field}) == true,系统会提示我 NOT_FOUND 状态。 然而,我每次都以 OK 状态结束。

我对 ResponseEntity 返回方式的预期是否错误? 如果 doesNotExist({some-field}) == true 有任何关于如何获得 NOT_FOUND 状态的建议,我们将不胜感激。

Edit/Update

根据评论,我认为我最初的问题有点浅显,所以让我解释一下 什么时候 我看到这个失败了,因为我对 ResponseEntity.HttpStatus 应该是正确的。

我对上面的代码块做了一些小的调整。 我收到意外状态的情况是当我尝试通过 Spring Cloud Contracts 测试 NOT_FOUND 情况时。

合约示例如下:

Contract.make {
  request {
    method 'POST'
    url "/foo/SomeNoneExistingField"
    body("{}")
    headers {
      contentType applicationJson()
    }
  }
  response {
    status HttpStatus.NOT_FOUND.value()
  }
}

所以本合同中的{some-field}设置为确保doesNotExist({some-field}) == true的字段。如果我也在调试我的代码,我会看到它最终出现在这个块中。 尽管如此,Spring Cloud Contract 测试状态 response.status == OK i.o。 NOT_FOUND.

如果我对从 CompletableFuture 返回的 HttpStatus 的假设是正确的,我可能会错误地使用 Spring 云合同吗? help/advice(再次)非常感谢。

这里没有什么复杂的东西,它应该按预期工作。

它正在发生可能是因为 {some-state} 不是真的所以每次它都会被 else 阻止。

确保 {some-state} 评估 returns true 和编译器进入 if 块。

if({some-state}) {
   return CompletableFuture.completedFuture(ResponseEntity.notFound().build());
}

好的,我发现了我遇到的问题。 感谢 让我在配置方面走上正轨。

我的合同中缺少能够处理异步结果的内容,例如 CompletableFuture,我需要将 async() 添加到我的结果中。

因此,像这样的合同:

Contract.make {
  request {
    method 'POST'
    url "/foo/SomeNoneExistingField"
    body("{}")
    headers {
      contentType applicationJson()
    }
  }
  response {
    status HttpStatus.NOT_FOUND.value()
    async() // <---- This was it!
  }
}

成功了。