#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;
}