Swagger Codegen 3 и Spring HATEOAS - PullRequest
0 голосов
/ 21 мая 2019

Я впервые делаю 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?

Заранее спасибо за помощь и руководство.

...