是否可以将响应标头添加到spring webflux控制器端点?例如,对于以下方法,我必须添加一个自定义标头,例如“ x-my-header”
3 items found.
Items are:
English
French
German
答案 0 :(得分:4)
在功能性API中,这确实很容易; ServerResponse
构建器几乎可以满足您所需的所有构建器。
带注释的控制器;您可以返回ResponseEntity<Flux<T>>
并设置标题:
@GetMapping(value = "/search/{text}")
public ResponseEntity<Flux<SearchResult>> search(@PathVariable(
value = "text") String text) {
Flux<SearchResult> results = searchService().find(text);
return ResponseEntity.ok()
.header("headername", "headervalue")
.body(results);
}
请注意,更新后的代码现在不需要@ResponseStatus
注释。
更新:
显然上述解决方案有效;除非您具有spring-cloud-starter-netflix-hystrix-dashboard
依赖性。在这种情况下,您可以使用以下代码:
@GetMapping(value = "/search/{text}")
public Mono<ResponseEntity<List<SearchResult>>> search(@PathVariable(
value = "text") String text) {
return searchService().find(text)
.collectList()
.map(list -> ResponseEntity.ok()
.header("Header-Name", "headervalue")
.body(list));
}
需要注意的几件事:
外部类型应为Mono<ResponseEntity<T>>
:有一个请求响应。如果您将其声明为Flux
,Spring将尝试将ResponseEntity
进行反序列化,就好像它是一个POJO。
您需要使用运算符将Flux
转换为Mono
:collectList()
或single()
将为您完成这项工作。
已通过Spring Boot 2.0.3.RELEASE检查