как преобразовать ‘requestParameters’ в массив

#spring-boot #spring-restdocs

#весенняя загрузка #spring-restdocs

Вопрос:

У меня есть сервис с полезной нагрузкой массива JSON, такой как:

 [{ message: "one"}, {message: "two"}]
  

Как я могу задокументировать это с помощью spring-restdocs ?

 MessageContract contractOne = new MessageContract();
contractOne.setMessage("one");

List list = new ArrayList<>();
list.add(contractOne);

this.webTestClient
                .post().uri("/messages")
                .body(BodyInserters.fromObject(list))
                .exchange().expectStatus().isCreated().expectBody()
                .consumeWith(document("POST messages",
                        requestParameters(
                                parameterWithName("message").description("Massage we should save"),
                        ))
                );
  

Я получил сообщение об ошибке:

 org.springframework.restdocs.snippet.SnippetException:
Request parameters with the following names were not found in the request:
[message, ...]
  

Я думаю, что restdocs не видит поле, потому что оно вставлено в массив. Как правильно с этим справиться?

Добавлено:

Ресурс:

 @PostMapping
private Mono<ResponseEntity> postMessage(@RequestBody List<MessageContract> contract) {
    return service
            .save(contract)
            .collectList()
            .thenReturn(new ResponseEntity(HttpStatus.CREATED));
}
  

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

1. Можете ли вы поделиться своей реализацией конечной точки и кодом создания списка?

2. @CristianColorado готово

3. Если вы хотите задокументировать тело запроса, вам следует использовать PayloadDocumentation.requestFields .

Ответ №1:

Я только что создал небольшой тест, с помощью которого вы сможете показать документацию по массиву requestFields.fieldWithPath .

Пожалуйста, убедитесь, что этот подход работает для вас.

     @Test
    public void documentRequestBodyArray() {
        webTestClient
                .post()
                .uri("/contract")
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .syncBody(List.of(new MessageContract("one"), new MessageContract("two")))
                .exchange()
                .expectStatus().isOk()
                .expectBody()
                .consumeWith(document("documentArray",
                        requestFields(
                                fieldWithPath("[]").description("a message array"),
                                fieldWithPath("[].message").description("a message"))));
    }
  

MessageContract Здесь выглядит так:

 import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MessageContract {
    private String message;
}