Я использую Mono
s с ResponseEntity
s в моих контроллерах Webflux для манипулирования заголовками и другой информацией ответа.Например:
@GetMapping("/{userId}")
fun getOneUser(@PathVariable userId: UserId): Mono<ResponseEntity<UserDto>> {
return repository.findById(userId)
.map(User::asDto)
.map { ResponseEntity.ok(it) }
.defaultIfEmpty(ResponseEntity.notFound().build())
}
@GetMapping
fun getAllUsers(): Flux<UserDto> {
return repository.findAllActive().map(User::asDto)
}
оба работают нормально, но есть случаи, когда необходимо иметь ResponseEntity
в сочетании с Flux
.Каким должен быть тип ответа?Правильно ли использовать ResponseEntity<Flux<T>>
?
Например:
@GetMapping("/{userId}/options")
fun getAllUserOptions(@PathVariable userId: UserId): ??? {
return repository.findById(userId)
.flatMapIterable{ it.options }
.map { OptionDto.from(it) }
// if findById -> empty Mono then:
// return ResponseEntity.notFound().build() ?
// else:
// return the result of `.map { OptionDto.from(it) }` ?
}
Поведение, которое я хотел бы достичь, заключается в том, что getAllUserOptions возвращает 404
, если repository.findById(userId)
является пустым Mono
, в противном случае возвращает user.options
as Flux
.
Обновление: репозиторий здесь ReactiveCrudRepository