У меня есть приложение 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.
Есть ли способ установить путь ресурса для подклассов здесь?