为什么 PersistentEntityResourceAssembler:getSingleResourceLinkTo 使用实体而不是存储库来构建单一资源 link?

Why does PersistentEntityResourceAssembler:getSingleResourceLinkTo uses entities instead of repositories to construct the single resource link?

我注意到在最新的 spring-数据发布序列 Gosling-RC1 中发生了一些变化 - 查看 PersistentEntityResourceAssembler 我现在可以看到方法 getSelfLinkFor 现在正在使用 entities 找到 PersistentEntity。更准确地说,它在这里:

https://github.com/spring-projects/spring-data-rest/commit/f8c7a1c376f64b9a36f5bb6bf834458402fd8b09#diff-b5d65266b4181597ee26baed60291de6R195

在使用 repositories 之前和 repositories 内部有这个递归调用:

    if (!userType.equals(Object.class)) {
        return getRepositoryFactoryInfoFor(userType.getSuperclass());
    }

检查超级 class 是否不是 Object 以尝试使用超级 class。 PersistentEntities class 但是没有这个递归调用:

        if (context.hasPersistentEntityFor(type)) {
            return context.getPersistentEntity(type);
        }

所以现在我得到了不同的行为。我有一个 Product 和一个扩展 ProductMyProduct。对于 Product 我有一个存储库,但是对于 MyProduct 我没有。使用 Gosling-M1 发布火车,我的链接呈现如下:

    "self" : {
      "href" : "http://localhost/rest/product/564546483459328{?projection}",
      "templated" : true
    }

但是当我升级到 Gosling-RC1 时,它们呈现如下:

    "self" : {
      "href" : "http://www.solarapparel.com/rest/myProductModel/564546483459328{?projection}",
      "templated" : true
    }

当我尝试调用 http://www.solarapparel.com/rest/myProductModel 时,它 returns 404 因为没有这样的存储库。

这是一个错误吗?或者这是一种已知的行为,这就是它应该如何工作的?

不,不是,因为您是在将苹果与橙子进行比较。在查找存储库时,自然也会查找超类型的存储库,因为存储库自然也可以保留超类型。

在查找特定类型的持久性元数据时,这当然是不同的。想象一下,您正在反射 API 中寻找特定类型的所有字段,它会继续检查超类型。这显然会产生无效结果。

PersistentEntityResourceAssembler 使用 PersistentEntities 而不是 Repositories 实例的原因——顾名思义——它也将用于为实体创建 Resource 实例不是聚合根。