将自定义响应头添加到 Spring WebFlux 控制器端点

No_*_*One 6 spring-webflux

有没有办法向 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)

有几点需要注意:

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

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

使用 Spring Boot 2.0.3.RELEASE 检查