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!
}
}
成功了。
所以,我创建了一个控制器,其中有一个 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!
}
}
成功了。