Переопределить путь ссылки для подклассов в Spring Boot - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть приложение Spring Boot 2.x, поддерживаемое MongoDB. Я пытаюсь добавить простое наследование в мою модель предметной области следующим образом:

Родитель: Person.java

// JSON annotations to assist in serializing requests to the right class
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "_class")
@JsonSubTypes({
  @JsonSubTypes.Type(value = Buyer.class, name = "com.company.domain.Buyer"),
  @JsonSubTypes.Type(value = Seller.class, name = "com.company.domain.Seller")
})
@Document(collection = "people")
public abstract class Person {
  ...
}

Подкласс 1: Buyer.java

@Document(collection = "people")
public class Buyer extends Person {
  ...
}

Подкласс 1: Продавец.java

@Document(collection = "people")
public class Seller extends Person {
  ...
}

По сути, я бы хотел, чтобы покупатели и продавцы хранились в одной коллекции Mongo и использовали один и тот же путь REST для работы с ними:

Репозиторий: PeopleRepository.java

@RepositoryRestResource(path = "people", collectionResourceRel = "people")
public interface PeopleRepository extends MongoRepository<Person, String> {
}

Это почти работает, за исключением того, что ссылки HATEOAS выглядят так:

{
  _links: {
    self: {
      href: http://localhost/services/buyer/5b96c785ba3e18ac91aa8cc9
    }
  }
}

Мне нужно, чтобы «покупатель» в href вместо этого стал «людьми», чтобы он совпал с конечной точкой хранилища выше.

Я попытался добавить аннотацию @ExposesResourceFor(Buyer.class) в репозиторий, которая, похоже, ничего не изменила (и мне понадобится другая аннотация для Seller.class, но невозможно добавить две аннотации @ExposesResourceFor). Я смог получить ссылки на работу, сделав второй репозиторий только для продавцов:

@RepositoryRestResource(path = "people", collectionResourceRel = "people", export = false)
  public interface SellerRepository extends MongoRepository<Seller, String> {
}

... но даже если для экспорта задано значение false, это похоже на работу с другим хранилищем. Кажется, есть вероятность 50/50 относительно того, будет ли приложение связывать конечную точку с репозиторием SellerRepository или PeopleRepository.

Есть ли способ установить путь ресурса для подклассов здесь?

1 Ответ

0 голосов
/ 11 сентября 2018

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

@RepositoryRestResource(path = "people", collectionResourceRel = "people")
public interface PeopleRepository<T extends Person> extends MongoRepository<T, String> {
  ...
}

public interface SellerRepository extends PeopleRepository<Seller> { }

public interface BuyerRespository extends PeopleRespository<Buyer> { }
...