我已经在PageAndSortingRepository
上配置了一个RepositoryRestResource
,它访问一个包含复合Id的实体:
@Entity
@IdClass(CustomerId.class)
public class Customer {
@Id BigInteger id;
@Id int startVersion;
...
}
public class CustomerId {
BigInteger id;
int startVersion;
...
}
@RepositoryRestResource(collectionResourceRel = "customers", path = "customers", itemResourceRel = "customers/{id}_{startVersion}")
public interface CustomerRepository extends PagingAndSortingRepository<Customer, CustomerId> {}
例如,当我访问"http://<server>/api/customers/1_1"
上的服务器时,我得到的是正确的资源json,但self_links部分中的href是错误的,而且对于我查询的任何其他客户也是一样的:"http://<server>/api/customer/1"
即:
{
"id" : 1,
"startVersion" : 1,
...
"firstname" : "BOB",
"_links" : {
"self" : {
"href" : "http://localhost:9081/reps/api/reps/1" <-- This should be /1_1
}
}
}
我想这是因为我的复合ID,但我很高兴我可以改变这种默认行为。
我已经看过ResourceSupport
和ResourceProcessor
类,但不确定我需要修改多少才能解决这个问题。
能有个懂Spring的人帮我一把吗?
5条答案
按热度按时间0s7z1bwu1#
不幸的是,所有的Spring Data JPA/Rest版本2.1.0.RELEASE都不能满足您的需求。源代码隐藏在Spring Data Commons/JPA本身中。Spring Data JPA只支持
Id
和EmbeddedId
作为标识符。摘录
JpaPersistentPropertyImpl
:SpringDataCommons不支持组合属性的概念,它将一个类的每个属性彼此独立地对待。
当然,您可以破解Spring Data Rest,但这很麻烦,不能解决问题的核心,并且降低了框架的灵活性。
这是一个技巧,它应该能给予你知道如何解决你的问题。
在您的配置中,覆盖
repositoryExporterHandlerAdapter
并返回CustomPersistentEntityResourceAssemblerArgumentResolver
。此外,覆盖backendIdConverterRegistry
并将CustomBackendIdConverter
添加到已知id converter
的列表中:创建
CustomBackendIdConverter
。此类负责呈现自定义实体id:CustomPersistentEntityResourceAssemblerArgumentResolver
应该依次返回一个CustomPersistentEntityResourceAssembler
:CustomPersistentEntityResourceAssembler
需要覆盖getSelfLinkFor
。如您所见,entity.getIdProperty()
返回Customer
类的id或startVersion属性,该属性又用于在BeanWrapper
的帮助下检索真实的值。这里,我们使用instanceof
运算符简化了整个框架。因此,您的Customer
类应该实现Serializable
以便进一步处理。就是这样!您应该会看到这个URI:
Imho,如果你正在做一个绿色领域的项目,我建议你完全抛弃
IdClass
,使用基于Long类的技术简单的id。这已经用Spring Data Rest 2.1.0.RELEASE,Spring Data JPA 1.6.0.RELEASE和Spring Framework 4.0.3.RELEASE测试过了。mpgws1up2#
虽然不太理想,但我已经通过在JPA实体上使用
@EmbeddedId
而不是IdClass
注解来解决这个问题。就像这样:
现在,我在返回的实体上看到了正确生成的链接
1_1
。如果还有人能指导我找到一个不需要我改变模型表示的解决方案,我将不胜感激。幸运的是,我在应用程序开发方面还没有取得很大进展,因此在改变时需要认真考虑这一点,但我想对于其他人来说,执行这样的改变会有很大的开销:(例如,在JPQL查询中更改引用此模型的所有查询)。
6ojccjat3#
我也遇到过类似的问题,data rest的复合键场景不起作用。@ksokol详细的解释提供了解决这个问题所需的输入。
这解决了所有与组合键相关的问题,我不需要做定制。谢谢ksokol的详细解释。
unguejic4#
首先,创建一个SpringUtil以从Spring中获取bean。
然后,实现BackendIdConverter。
在那之后,你可以做你想做的事.
下面有一个示例。
9bfwbjaz5#
上面提供的答案很有帮助,但如果您需要更通用的方法,请遵循以下步骤-