将自定义响应 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));
}

有几点需要注意:

  1. 外部类型应该是Mono<ResponseEntity<T>>: 请求有一个响应。如果您将其声明为 Flux,Spring 将尝试反序列化 ResponseEntity,就好像它是一个 POJO。

  2. 您需要使用运算符将​​ Flux 转换为 MonocollectList()single() 将为您完成这项工作。

使用 Spring Boot 2.0 检查。3.RELEASE