Как я могу документировать ссылки в остальных документах

Я пытаюсь документировать метод, который возвращает список владельцев, используя документы весеннего отдыха, но я не знаю, как документировать ссылки, предоставленные Hateoas.

linkWithRel(...) не работает с объектом _embedded.ownerDtoList.

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class OwnerDto extends RepresentationModel<OwnerDto> {

@Null
private UUID id;

@NotBlank
@Size(min = 3, max = 20)
private String name;

}

@GetMapping(value = "")
public ResponseEntity<CollectionModel<OwnerDto>> getOwners() {
    List<OwnerDto> owners = ownerService.findAllOwners();
    HttpHeaders headers = new HttpHeaders();
    headers.add("X-Owners-Total", Integer.toString(owners.size()));
    owners.stream().map(owner -> owner
            .add(linkTo(OwnerController.class).slash(owner.getId()).withSelfRel())
            .add(linkTo(OwnerController.class).withRel("owners")))
            .collect(Collectors.toList());

    Link mainSelfLink = linkTo(OwnerController.class).withSelfRel();
    return new ResponseEntity<>(
            new CollectionModel<>(owners, mainSelfLink),
            headers,
            HttpStatus.OK
    );
}        



public void findAllOwners() throws Exception {

    List<OwnerDto> ownerDtoList = Arrays.asList(ownerDto_1, ownerDto_2);
    Mockito.when(ownerService.findAllOwners()).thenReturn(ownerDtoList);

    mockMvc.perform(get("/api/v1/owner")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$._embedded.ownerDtoList[0].id", is(ownerDto_1.getId().toString())))
            .andExpect(jsonPath("$._embedded.ownerDtoList[0].name", is(ownerDto_1.getName())))
            .andExpect(jsonPath("$._embedded.ownerDtoList[1].id", is(ownerDto_2.getId().toString())))
            .andExpect(jsonPath("$._embedded.ownerDtoList[1].name", is(ownerDto_2.getName())))
            .andExpect(header().longValue("X-Owners-Total", 2L))
            .andDo(document("v1/{method-name}", ownerPageHeadersSnippet(), ownerCollectionResponseFieldsSnippet(),

                    links(
                            halLinks(),
                            linkWithRel("owners").description("Get all owners <<Resource>>"),
                            linkWithRel("self").description("Self <<Resource>>")
                    )
            ));
}

{
"_embedded": {
    "ownerDtoList": [
        {
            "id": "9eccbed8-6184-470c-b635-7d7bd4196caf",
            "name": "Szymaa",
            "_links": {
                "self": {
                    "href": "http://localhost:8088/api/v1/owner/9eccbed8-6184-470c-b635-7d7bd4196caf"
                },
                "owners": {
                    "href": "http://localhost:8088/api/v1/owner"
                }
            }
        },
        {
            "id": "f0edf088-d1ff-49dc-9561-e65ab0dcd645",
            "name": "dsad23",
            "_links": {
                "self": {
                    "href": "http://localhost:8088/api/v1/owner/f0edf088-d1ff-49dc-9561-e65ab0dcd645"
                },
                "owners": {
                    "href": "http://localhost:8088/api/v1/owner"
                }
            }
        }
    ]
},
"_links": {
    "self": {
        "href": "http://localhost:8088/api/v1/owner"
    }
}

}

org.springframework.restdocs.snippet.SnippetException: В ответе не найдены ссылки со следующими отношениями: [владельцы]


person Syma    schedule 11.11.2019    source источник


Ответы (1)


Spring REST Docs не поддерживает это из коробки. Вместо того, чтобы документировать ссылки для встроенного ресурса как часть документации для каждого ресурса, который его внедряет, рекомендуется вместо этого сделать ссылку на документацию для встроенного ресурса. В вашем случае это будет ссылка на документацию для ресурса ownerDtoList (который, я подозреваю, доступен как http://localhost:8088/api/v1/owner).

Если вы предпочитаете документировать встроенные ссылки на ресурсы везде, где они встроены, вы можете реализовать собственный LinkExtractor и использовать его вместо halLinks().

Вы можете узнать немного больше об этом в этом выпуске Spring REST Docs.

person Andy Wilkinson    schedule 12.11.2019