因此,我创建了一个Controller,其中有一个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
的方式,我的期望是否错误?
如果有NOT_FOUND
,如何获得doesNotExist({some-field}) == true
状态的任何建议,将不胜感激。
从这些评论中,我认为我的第一个问题有点难理解,所以让我解释一下何时,这似乎是失败的,因为看来我对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
NOT_FOUND
。
如果我对从HttpStatus
返回的CompletableFuture
的假设是正确的,我可能会错误地使用Spring Cloud Contracts?
(再次)非常感谢任何帮助/建议。
答案 0 :(得分:0)
这里没有什么复杂的,它应该可以按预期工作。
发生这种情况的原因可能是因为var response = SubmitRequest<SomeAppropriateType>(...); // pass in your parameter values
不正确,所以每次都将其阻塞。
确保{some-state}
评估返回{some-state}
,并且编译器进入true
块。
if
答案 1 :(得分:0)
好的,我发现了我遇到的问题。 感谢@Marcin Grzejszczak使我在配置方面处于正确的轨道。
合同中缺少像CompletableFuture
这样的异步结果处理能力,我需要在结果中添加async()
。
因此,这样的合同:
Contract.make {
request {
method 'POST'
url "/foo/SomeNoneExistingField"
body("{}")
headers {
contentType applicationJson()
}
}
response {
status HttpStatus.NOT_FOUND.value()
async() // <---- This was it!
}
}
搞定了。