Stackoverflow when retrieving jwt token in WebTestClient and seting it in ExchangeFilterFunction

Viewed 583

The latest Spring Boot 2.3.1.RELEASE, Java 11.

 private ExchangeFilterFunction userJwtAuthentication() {
        return ExchangeFilterFunction.ofRequestProcessor(
                request -> generateToken("user")
                        .map(jwt -> ClientRequest.from(request)
                                .headers(headers -> headers.setBearerAuth(jwt))
                                .build()
                        )
        );
    }

    private Mono<String> generateToken(String username) {
        return this.client
                .post().uri("/auth/login")
                .bodyValue(AuthenticationRequest.builder().username(username).password("password").build())
                .exchange()
                .returnResult(new ParameterizedTypeReference<Map<String, String>>() {
                })
                .getResponseBody()
                .last()
                .map(d -> d.get("access_token"))
                .doOnSubscribe(
                        jwt -> log.debug("generated jwt token::" + jwt)
                );

    }

And use it in tests

client.mutate().filter(userJwtAuthentication()).build()

When testing my APIs, it returns.


ava.lang.StackOverflowError
    at java.base/java.util.regex.Pattern$Branch.match(Pattern.java:4749)
    at java.base/java.util.regex.Pattern$GroupTail.match(Pattern.java:4863)
    at java.base/java.util.regex.Pattern$CharPropertyGreedy.match(Pattern.java:4306)
    at java.base/java.util.regex.Pattern$GroupHead.match(Pattern.java:4804)
    at java.base/java.util.regex.Pattern$Branch.match(Pattern.java:4747)
    at java.base/java.util.regex.Pattern$Branch.match(Pattern.java:4747)
    at java.base/java.util.regex.Pattern$Begin.match(Pattern.java:3683)
    at java.base/java.util.regex.Matcher.match(Matcher.java:1756)
    at java.base/java.util.regex.Matcher.matches(Matcher.java:713)
    at org.springframework.web.util.UriComponentsBuilder.fromUriString(UriComponentsBuilder.java:215)
    at org.springframework.web.util.DefaultUriBuilderFactory$DefaultUriBuilder.initUriComponentsBuilder(DefaultUriBuilderFactory.java:242)
    at org.springframework.web.util.DefaultUriBuilderFactory$DefaultUriBuilder.<init>(DefaultUriBuilderFactory.java:233)
    at org.springframework.web.util.DefaultUriBuilderFactory.uriString(DefaultUriBuilderFactory.java:160)
    at org.springframework.web.util.DefaultUriBuilderFactory.expand(DefaultUriBuilderFactory.java:153)
    at org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.uri(DefaultWebClient.java:176)
    at org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.uri(DefaultWebClient.java:151)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.uri(DefaultWebTestClient.java:163)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.uri(DefaultWebTestClient.java:146)
    at com.example.demo.IntegrationTests.generateToken(IntegrationTests.java:246)
    at com.example.demo.IntegrationTests.lambda$adminJwtAuthentication$5(IntegrationTests.java:236)
    at org.springframework.web.reactive.function.client.ExchangeFilterFunction.lambda$ofRequestProcessor$3(ExchangeFilterFunction.java:79)
    at org.springframework.web.reactive.function.client.ExchangeFilterFunction.lambda$apply$2(ExchangeFilterFunction.java:68)
    at org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.lambda$exchange$0(DefaultWebClient.java:338)
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4219)
    at reactor.core.publisher.Mono.block(Mono.java:1702)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultRequestBodyUriSpec.exchange(DefaultWebTestClient.java:307)
...

If I used blockLast to retrieve token firstly, it worked., my question is how to use Reactor API to do the same work.

The complete codes is here.

0 Answers
Related