Вот мое демо:
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.time.Duration;
import java.util.stream.IntStream;
@Slf4j
@RequiredArgsConstructor
@RestController
public class WebFluxDemo {
private final ObjectMapper objectMapper;
@GetMapping("/getMyObjs")
Flux<MyObj> getMyObjs() {
return Flux.fromStream(IntStream.range(1, 6).boxed()
.map(String::valueOf)
)
.map(MyObj::new)
.delayElements(Duration.ofSeconds(1))
.log()
;
}
@GetMapping("/getMyObjsAsString")
Flux<String> getMyObjsAsString() {
return Flux.fromStream(IntStream.range(1, 6).boxed()
.map(String::valueOf))
.map(MyObj::new)
.map(this::mapToObj)
.delayElements(Duration.ofSeconds(1))
.log()
;
}
@SneakyThrows
private String mapToObj(MyObj myObj) {
return objectMapper.writeValueAsString(myObj);
}
private record MyObj(String id) {
}
}
1. Валидный массив открывается и закрывается скобками. Т.е. он должен быть закрытым. Если он не закрыт - это не валидный массив.
2. Поэтому, если мы отдаем flux (см. getMyObjs()) то получим валидный массив, но ответ будет отдан только на onComplete. Т.е. все сразу и когда поступят все элементы.
3. Можно отдавать строку - тогда элементы будут отданы по мере поступления, но "валидного массива" никакого не будет.