gpt4 book ai didi

java - Spring Data REST - 抽象类型关联的投影

转载 作者:行者123 更新时间:2023-11-30 08:43:15 27 4
gpt4 key购买 nike

具有以下实体(省略不相关的字段):

@Entity
public class TransferConfiguration {

@ManyToOne
@JoinColumn(name = "RECIPIENT_ID", nullable = false)
private Party recipient;
}

@Entity
@Inheritance
@DiscriminatorColumn(name = "type")
public abstract class Party {

}

@Entity
@DiscriminatorValue("C")
public class Customer extends Party {

}

@Entity
@DiscriminatorValue("O")
public class OtherParty extends Party {

}

关联是基于抽象类的。

现在我想在获取资源时链接到关联,但是 Spring Data REST 总是内联关联,在生成的 JSON 的 _links 部分不提供任何链接。

输出如下:

{
"recipient": {
// recipient attributes inlined here
},
// other attributes here
"_links": {
"self": {
"href": "http://myhost/api/transferConfigurations/20"
},
"transferConfiguration": {
"href": "http://myhost/api/transferConfigurations/20"
}
}
}

我有两个具体类(Customer、OtherParty)的存储库接口(interface),但没有父类(super class)本身的存储库接口(interface)。现在,当 spring-data-rest 决定是否内联关联时,它会尝试找到不存在的 Party 父类(super class)的接口(interface),因此内联关联。

是否有可能以某种方式改变行为?

我想要一个链接而不是内联关联。像这样:

{
// other attributes here
"_links": {
"self": {
"href": "http://myhost/api/transferConfigurations/20"
},
"transferConfiguration": {
"href": "http://myhost/api/transferConfigurations/20"
},
"recipient": {
"href": "http://myhost/api/transferConfigurations/20/recipient"
},
}
}

最佳答案

最后对该主题进行了一些研究,上面的场景根本不可能在 Spring Data Rest 中实现(我使用的是 2.4.1.RELEASE 版本)。

问题在于如何确定关联类型。 SDR 使用 JPA 元模型(而不是检查被序列化的实际负载)来确定类型,这显然是父类(super class)型(在本例中为 Party)。然后框架检查是否有该类型的存储库,因为没有,关联是内联的。

有问题的代码在类AssociationLinks,方法isLinkableAssociation()中,其中metadata.isExported()检查存储库是否导出基于关联父类(super class)型。

public boolean isLinkableAssociation(PersistentProperty<?> property) {

if (property == null || !property.isAssociation()) {
return false;
}

ResourceMetadata metadata = mappings.getMetadataFor(property.getOwner().getType());

if (metadata != null && !metadata.isExported(property)) {
return false;
}

metadata = mappings.getMetadataFor(property.getActualType());
return metadata == null ? false : metadata.isExported();
}

最后,我硬着头皮导出了父类(super class)存储库以便获得链接。

关于java - Spring Data REST - 抽象类型关联的投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34360421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com