Я впервые делаю RESTful API с помощью OAS 3.0, Swagger Codegen, Spring MVC и Spring HATEOAS. Я хочу использовать определение OAS для создания документации и создания заглушек сервера / клиента и использовать HATEOAS для создания ресурсов, связанных с гиперссылками.
В настоящее время у меня есть ресурсы, расширяющие ResourceSupport
, и я могу добавить свои ссылки так, чтобы в ответах были поля _embedded
и _links
, которые я ожидал бы. Моя проблема заключается в том, как правильно сопоставить HATEOAS Resource
с моделью, сгенерированной кодексом Swagger. Мое определение OAS соответствует ответу hal+json
, поэтому поля идентичны в модели Swagger и в моем HATEOAS Response
.
Есть ли способ легко сопоставить их? Я также готов согласиться с тем, что я неверно истолковываю это, и что эти структуры на самом деле не сочетаются друг с другом.
Пример OAS:
responses:
200:
description: ...
content:
application/hal+json:
schema:
$ref: '#/components/schemas/OasPersonResponse'
components:
schemas:
OasPersonResponse:
type: object
properties:
firstName:
type: string
lastName:
type: string
_links:
type: object
properties:
self:
type: object
properties:
href:
type: string
Resource
пример:
public class PersonResource extends ResourceSupport {
private final Person person;
public PersonResource(Person person) {
this.person = person;
}
public String getFirstName() {
return person.getFirstName();
}
public String getLastName() {
return person.getLastName();
}
}
Пример контроллера:
@Controller
public class PersonController implements PersonApi {
@Override
public ResponseEntity<OasPersonResponse> getPersonById(Integer personId) {
Person person = someDb.getPerson(personId);
PersonResource personResource = new PersonResource(person);
personResource
.add(linkTo(methodOn(PersonController.class)
.getPersonById(personId))
.withSelfRel();
Resource<PersonResource> returnResource =
new Resource(personResource);
return new ResponseEntity<>(returnResponse, HttpStatus.OK);
}
Моя проблема связана с заглушкой, сгенерированной swagger codegen, ожидающей тип возврата ResponseEntity<OasPersonResponse>
, но имеющей ссылку на Resource<PersonResource>
. И OasPersonResponse
, и PersonResource
представляют одни и те же данные, но OasPersonResponse
явно определяет объект _links
, тогда как ответ с PersonResource
сериализуется для получения объекта _links
.
Есть ли простой способ конвертировать ресурс HATEOAS в модель, созданную swagger codegen?
Заранее спасибо за помощь и руководство.