Spring rest docs не удается документировать параметры пути с помощью WebTestClient

#java #spring-webflux #spring-restdocs

#java #spring-webflux #spring-restdocs

Вопрос:

После обновления до Spring-test-5.3.0-SNAPSHOT spring rest docs не может документировать параметры пути, жалуясь, что не может найти 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 устанавливает для UriTemplate значение null при создании uri, но не может найти способ его переопределить.

Комментарии:

1. Вы должны создать отчет об ошибке.

2. Вы уверены, что DefaultWebTestClient это значение uriTemplate null равно? Глядя на код , он будет делать это только при вызове с URI помощью or Function<UriBuilder, URI> , а ваш приведенный выше код этого не делает. Это вызов uri(String uriTemplate, Object... uriVariables) , который установит шаблон.

3. Все методы uri в конечном итоге вызывают RequestBodySpec uri(URI uri) метод, который устанавливает UriTemplate в null, поэтому не имеет значения, какой метод я использовал. @AndyWilkinson

4. Вы правы. Извините, я пропустил, что вы использовали моментальные снимки 5.3.

Ответ №1:

К сожалению, в последних моментальных снимках Spring Framework 5.3 наблюдается регрессия, и я не верю, что вы можете ее обойти. Я поднял проблему Spring Framework. В то же время вы можете использовать Spring Framework 5.3.0.RC1, поскольку он был выпущен до появления проблемы.