将自定义响应 header 添加到 Spring WebFlux 控制器端点
Adding custom Response header to Spring WebFlux contoller endpoint
有没有办法将响应 header 添加到 spring webflux 控制器端点?例如,对于以下方法,我必须添加自定义 header 说 'x-my-header'
@GetMapping(value = "/search/{text}")
@ResponseStatus(value = HttpStatus.OK)
public Flux<SearchResult> search(@PathVariable(
value = "text") String text){
return searchService().find(text);
}
在函数式API中,这真的很容易; ServerResponse
构建器几乎可以满足您的所有需求。
带有注释的控制器;你可以 return 一个 ResponseEntity<Flux<T>>
并设置 headers:
@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
有没有办法将响应 header 添加到 spring webflux 控制器端点?例如,对于以下方法,我必须添加自定义 header 说 'x-my-header'
@GetMapping(value = "/search/{text}")
@ResponseStatus(value = HttpStatus.OK)
public Flux<SearchResult> search(@PathVariable(
value = "text") String text){
return searchService().find(text);
}
在函数式API中,这真的很容易; ServerResponse
构建器几乎可以满足您的所有需求。
带有注释的控制器;你可以 return 一个 ResponseEntity<Flux<T>>
并设置 headers:
@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