有没有办法向 spring webflux 控制器端点添加响应头?例如,对于以下方法,我必须添加一个自定义标题,例如“x-my-header”
@GetMapping(value = "/search/{text}")
@ResponseStatus(value = HttpStatus.OK)
public Flux<SearchResult> search(@PathVariable(
value = "text") String text){
return searchService().find(text);
}
Run Code Online (Sandbox Code Playgroud)
Mur*_*kan 11
在函数式 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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,更新后的代码@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));
}
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
外部类型应该是Mono<ResponseEntity<T>>:请求有一个响应。如果您将其声明为 a Flux,Spring 将尝试反序列化 ,ResponseEntity就好像它是 POJO 一样。
您需要使用运算符将 theFlux转换为Mono:collectList()或single()将为您完成这项工作。
使用 Spring Boot 2.0.3.RELEASE 检查
| 归档时间: |
|
| 查看次数: |
7842 次 |
| 最近记录: |