覆盖Spring Boot中子类的链接路径

时间:2018-09-10 21:06:00

标签: spring-boot spring-hateoas

我有一个由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。

是否在这里设置子类的资源路径?

1 个答案:

答案 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> { }