Ответы пользователя по тегу Netty
  • Как в Reactor Netty обрабатывать ошибки внутри Flux?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Вам нужно.
    - Сделать флюкс не строки, а какого-то своего типа, который будет содержать статус и саму строку
    - Добавить логику, при которой статус будет зависить от содержания флюкса

    Тогда методом .onErrorResume можно будет поймать исключение, обработать и добавить к ответу.
    Ответ написан
    Комментировать
  • Как из Flux собрать массив JSON?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Вот мое демо:
    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. Можно отдавать строку - тогда элементы будут отданы по мере поступления, но "валидного массива" никакого не будет.
    Ответ написан
  • Как в Reactor Netty Http Server получить тело POST-запроса?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    public Publisher<Void> addReport(HttpServerRequest req, HttpServerResponse resp) {
            return req.receive()
                    .asString()
                    .doOnNext(string -> {
                        // todo :: make some handy job with string
                        System.out.println(string);
                    })
                    .flatMap(__ -> resp.status(HttpResponseStatus.OK)  
                            .addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*")     // CORS
                            .sendString(Mono.just("")));
        }
    Ответ написан
    5 комментариев