Абсолютный заголовок местоположения для HTTP 201 с Spring Webflux - PullRequest
1 голос
/ 11 февраля 2020

У меня есть реактивный REST-контроллер (с Spring WebFlux), и при выполнении запросов POST я хочу установить абсолютную ссылку на только что созданный ресурс в обязательный Location заголовок. Пока я могу создавать только относительные ссылки. Добавление org.springframework.http.server.reactive.ServerHttpRequest или org.springframework.web.server.ServerWebExchange в качестве дополнительных параметров метода в любом порядке для получения информации о хосте и т. Д. c. в результате HTTP 415 ответов без достижения метода контроллера.

@RequestMapping("/v1/stuffs")
@RestController
public class StuffController {

    @PostMapping
    public Mono<ResponseEntity<Stuff>> createStuff(
            @Valid @NotNull @RequestBody Mono<Stuff> stuff) {
        UUID id = UUID.randomUUID();

        URI uri = UriComponentsBuilder.newInstance().pathSegment("v1", "stuffs", id.toString()).build().toUri();

        // ugly approach with help of spring-hateoas, which resulted in a relative link too
        // URI uri = WebFluxLinkBuilder.linkTo(WebFluxLinkBuilder.methodOn(StuffController.class).getStuff(id)).withSelfRel().toMono().block().toUri();

        return stuff
            .map(it -> stuffService.create(id, it))
            .map(it -> ResponseEntity.created(uri).build());
    }

    @GetMapping("/{id}")
    public Mono<ResponseEntity<Stuff>> getStuff(@NotNull @PathVariable("id") UUID id) {
        // ...
    }

}
...