为什么 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
。更准确地说,它在这里:
在使用 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
和一个扩展 Product
的 MyProduct
。对于 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
实例不是聚合根。
我注意到在最新的 spring-数据发布序列 Gosling-RC1
中发生了一些变化 - 查看 PersistentEntityResourceAssembler
我现在可以看到方法 getSelfLinkFor
现在正在使用 entities
找到 PersistentEntity
。更准确地说,它在这里:
在使用 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
和一个扩展 Product
的 MyProduct
。对于 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
实例不是聚合根。