我有一个由MongoDB支持的Spring Boot 2.x应用程序。我正在尝试通过以下方式向我的域模型添加一些简单的继承:
父项: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:Seller.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> {
}
...但是即使将export设置为false,这似乎也会干扰其他存储库。应用程序将端点绑定到SellerRepository还是PeopleRepository的可能性似乎为50/50。
是否在这里设置子类的资源路径?
答案 0 :(得分:0)
看起来我终于可以通过添加其他存储库(扩展了基础存储库)来使它正常工作。 不批注这些存储库很重要。
@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> { }