Spring Rest文档无法使用WebTestClient记录pathParameters

问题描述

升级到Spring-test-5.3.0-SNAPSHOT后,spring rest文档由于无法找到urlTemplate而抱怨未能记录路径参数。

webTestClient.mutateWith(csrf()).get()
        .uri("/products/{productId}",productId)
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .expectStatus().isOk()
        .expectHeader().contentType(MediaType.APPLICATION_JSON)
        .expectBody()
        .consumeWith(document("find-product-by-id",pathParameters(
                        parameterWithName("productId").description("...")
                ),responseFields(getProductResponseFields())));

错误日志:

urlTemplate not found. If you are using mockmvc did you use RestDocumentationRequestBuilders to build the request?
java.lang.IllegalArgumentException: urlTemplate not found. If you are using mockmvc did you use RestDocumentationRequestBuilders to build the request?
    at org.springframework.util.Assert.notNull(Assert.java:201)
    at org.springframework.restdocs.request.PathParameteRSSnippet.extractUrlTemplate(PathParameteRSSnippet.java:126)
    at org.springframework.restdocs.request.PathParameteRSSnippet.extractActualParameters(PathParameteRSSnippet.java:113)
    at org.springframework.restdocs.request.AbstractParameteRSSnippet.verifyParameterDescriptors(AbstractParameteRSSnippet.java:89)
    at org.springframework.restdocs.request.AbstractParameteRSSnippet.createModel(AbstractParameteRSSnippet.java:74)
    at org.springframework.restdocs.request.PathParameteRSSnippet.createModel(PathParameteRSSnippet.java:98)
    at org.springframework.restdocs.snippet.TemplatedSnippet.document(TemplatedSnippet.java:78)
    at org.springframework.restdocs.generate.RestDocumentationGenerator.handle(RestDocumentationGenerator.java:191)
    at org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.lambda$document$0(WebTestClientRestDocumentation.java:77)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultBodyContentSpec.lambda$consumeWith$3(DefaultWebTestClient.java:665)
    at org.springframework.test.web.reactive.server.ExchangeResult.assertWithDiagnostics(ExchangeResult.java:223)
    at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultBodyContentSpec.consumeWith(DefaultWebTestClient.java:665)

好像DefaultWebTestClient在构造uri时将uriTemplate设置为null,但是找不到覆盖它的方法

解决方法

不幸的是,最新的Spring Framework 5.3快照中存在回归,我不认为您可以解决它。我提出了Spring Framework issue。同时,您可以使用Spring Framework 5.3.0.RC1,因为它是在引入问题之前发布的。