webflux Mono ответ пуст - PullRequest
       137

webflux Mono ответ пуст

1 голос
/ 30 мая 2020

У меня в моем проекте очень простая конечная точка Spring webflux rest.

@Bean
public RouterFunction authRoute() {
    return RouterFunctions.route(POST("/auth/signin").and(accept(APPLICATION_JSON)), this::signIn)
            .andRoute(POST("/auth/signup").and(accept(APPLICATION_JSON)), this::signUp)
            .andRoute(POST("/auth/test").and(accept(APPLICATION_JSON)), this::test);
}

И /auth/test конечная точка просто ответит с указанным именем пользователя. terminal

Проблема, с которой я столкнулся, заключается в том, что тело ответа пусто, это должно быть имя пользователя. Я также подтвердил, что когда я возвращаю жестко запрограммированную строку, она проходит. Он не работает, когда я зависим от jwtRequestMono.flatMap(...

![postman

1 Ответ

3 голосов
/ 30 мая 2020

Эта строка почти наверняка ваша ошибка:

jwtRequestMono.subscribe(v -> System.out.println(v.getUsername() + ":" + v.getPassword()));

Ваш запрос не может быть подписан несколько раз, поэтому вы подписываетесь на него в этой строке (которая работает и печатает значения, как ожидалось), затем framework подписывается на него, и он взрывается. Я ожидал увидеть исключение и ответ 500, когда это произойдет по умолчанию, так что есть вероятность, что вы проглатываете где-то исключение.

Никогда не подписывайтесь в своем собственном приложении. Это задание фреймворков.

Вместо этого, если вы хотите иметь «побочный эффект», когда вы печатаете значения по мере их поступления, используйте doOnNext() как часть вашей реактивной цепочки:

return jwtRequestMono
        .doOnNext(v -> System.out.println(v.getUsername() + ":" + v.getPassword()))
        .flatMap(j -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(j.getUsername()));
...