将自定义Response标头添加到Spring WebFlux contoller端点

时间:2018-07-09 13:11:15

标签: spring-webflux

是否可以将响应标头添加到spring webflux控制器端点?例如,对于以下方法,我必须添加一个自定义标头,例如“ x-my-header”

3 items found.
Items are: 
English
French
German

1 个答案:

答案 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));
}

需要注意的几件事:

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

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

已通过Spring Boot 2.0.3.RELEASE检查