Spring HATEOAS неправильная самостоятельная связь со связанными ресурсами - PullRequest
0 голосов
/ 16 марта 2019

Я использую Spring Boot 2.0.3, Spring Data REST, Spring HATEOAS.Моя модель предметной области довольно структурирована, но в последнее время я обнаружил странное поведение в собственных ссылках.

Я собираюсь показать часть модели, чтобы указать на проблему, удалив ненужную часть:

EyeExam:

@EntityListeners(value = EyeExamListener.class)
public class EyeExam extends AbstractEntity {

    @NotNull
    @JoinColumn(name = "contact_id", updatable = false)
    @JsonDeserialize(using = ContactUriDeserializer.class)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Contact contact;

    @NotNull
    @Column(nullable = false, columnDefinition = "DATE")
    private Instant date;

Контакт:

@EntityListeners({ContactListener.class})
public class Contact extends AbstractEntity {

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(nullable = false, columnDefinition = "VARCHAR(30) DEFAULT 'CUSTOMER'")
    private ContactType type = ContactType.CUSTOMER;

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(nullable = false, columnDefinition = "VARCHAR(30) DEFAULT 'NATURAL_PERSON'")
    private PersonType personType = PersonType.NATURAL_PERSON;

    private String firstName;

    private String lastName;

    private String companyName;

Это ContactRepository :

@Transactional
@PreAuthorize("isAuthenticated()")
public interface ContactRepository extends JpaRepository<Contact, Long> {
 ....
 ....
}

Когда я получаю определенный ресурс EyeExam (https://myserver.com/api/v1/eyeExams/13) Spring возвращает:

  {
  "sid" : "f16d6e45-477f-11e9-898e-9d6f4f2f5990",
  "createdBy" : "system",
  "createdDate" : "2017-05-31T17:38:00Z",
  "lastModifiedDate" : null,
  "lastModifiedBy" : null,
  "createdByName" : "System",
  "lastModifiedByName" : null,
  "date" : "2017-05-31T00:00:00Z",

  "_links" : {
    "self" : {
      "href" : "https://myserver.com/api/v1/eyeExams/13"
    },
    "eyeExam" : {
      "href" : "https://myserver.com/api/v1/eyeExams/13{?projection}",
      "templated" : true
    },
    "supplyTypes" : {
      "href" : "https://myserver.com/api/v1/eyeExams/13/supplyTypes"
    },
    "changeStatus" : {
      "href" : "https://myserver.com/api/v1/eyeExams/13/changeStatus?status=%7Bstatus%7D"
    },
    "contact" : {
      "href" : "https://myserver.com/api/v1/eyeExams/13/contact{?projection}",
      "templated" : true
    },
    "store" : {
      "href" : "https://myserver.com/api/v1/eyeExams/13/store{?projection}",
      "templated" : true
    }
  }
}

Как вы видите, я получаю ссылку на связанный ресурс Contact. Это нормально. Теперь я получаю ресурсhttps://myserver.com/api/v1/eyeExams/13/contact и ответы Spring:

{
  "sid" : "4c2ba300-477e-11e9-898e-9d6f4f2f5990",
  "createdBy" : "system",
  "createdDate" : "2018-11-01T09:00:00Z",
  "lastModifiedDate" : null,
  "lastModifiedBy" : null,
  "createdByName" : "System",
  "lastModifiedByName" : null,
  "type" : "CUSTOMER",
  "personType" : "NATURAL_PERSON",
  "firstName" : "John",
  "lastName" : "Smith",
  "companyName" : null,  
  "_links" : {
    "self" : {
      "href" : "https://myserver.com/api/v1/contact/22352"
    },
    "contact" : {
      "href" : "https://myserver.com/api/v1/contact/22352{?projection}",
      "templated" : true
    },
    "notes" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/notes"
    },
    "auditLogs" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/auditLogs"
    },
    "media" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/media"
    },
    "privacyAgreements" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/privacyAgreements"
    },
    "eyeExams" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/eyeExams"
    },
    "eyeExamsCount" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/eyeExams/count"
    },
    "documents" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/documents"
    },
    "pendingSalesOrders" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/pendingSalesOrders"
    },
    "lastPurchasedFrames" : {
      "href" : "https://myserver.com/api/v1/contacts/22352/lastPurchasedFrames"
    },
    "store" : {
      "href" : "https://myserver.com/api/v1/contact/22352/store{?projection}",
      "templated" : true
    }
  }
}

Я хочу указать ссылку на себя. Это неправильно , фактически это должно быть https://myserver.com/api/v1/contacts/22352 с окончанием -s.

Я использовал какой-то собственный ResourceProcessor, но даже без них у меня та же проблема.

Прямо сейчас я создал обходной путь в ContactResourceProcessor, переписав собственную ссылкус правильным, но я хотел бы понять, если я делаю что-то не так, если это ошибка, или я просто пропустил что-тог.

1 Ответ

0 голосов
/ 17 марта 2019

Возможно, это ошибка, но попробуйте этот обходной путь:

@RepositoryRestResource(path="contacts")
@Transactional
@PreAuthorize("isAuthenticated()")
public interface ContactRepository extends JpaRepository<Contact, Long> {
 ....
 ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...